• 欢迎访问,如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

private多继承在用using重定义两个同名函数的访问权限后怎么调用函数

C++语言 码拜 3年前 (2017-04-26) 211次浏览
。最近在看c++primer 看到了using重定义访问权限,就按照书上写了下面这样一个程序,重定义了两个size函数。但是在main里面却不知道怎么调用他们,本人用的是VS2013,以下代码编译器这样报错:
2 IntelliSense:  不允许对不可访问的基类 “std::basic_string<char, std::char_traits<char>, std::allocator<char>>” 进行转换 c:\Users\寰\Desktop\C++\快速程序代码\练习21 多继承.cpp 57 63 编译快速程序用项目
假如去掉一个using,再把main里面的string::去掉就能正确的使用,为什么呢
#include<iostream>
#include<valarray>
#include<string>
using namespace std;
typedef valarray<int> arrayi;
class student :private string, private arrayi{
public:
student(char* str = “error”, int length_of_int = 0, int*arr = NULL) :string(str), arrayi(arr, length_of_int){}
//3.假如在想要重新定义访问权限的话
using string::size;
using arrayi::size;
};
int main(void){
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
student A(“Chen”, 9, arr);
cout << “redefine the authority of function :A.size() = ” << A.string::size() << endl;
cin.get();
return 0;
}
解决方案

20

using 将 size 这个符号引入了 calss student ,所以访问的是有需要使用:
student A;
A.size();
但是你一下引入了两个 size ,都是函数,参数表还一样,在调用的时候必然会冲突(无法区分使用的是哪个)。
A.string::size() 与 A.size() 的语义是不同的。
A.string::size() 会先检验 string 能否是可访问的(不是),于是直接失败了。
A.size() 则会现在 class student 里(而不是基类)找 size ,找到了两个。注意这两个 size 不是基类的 size ,而是 class student 的 size 。这两个 size 都是函数,参数一致,无法区分,于是 ambiguity 。

40

既然你已经写了using string::size;  调用时可以直接: A.size()
但是你有两个size,无法分辨你要的是哪一个,所以你只留一句using
名字空间就是为了防止重复的名称污染……..

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明private多继承在用using重定义两个同名函数的访问权限后怎么调用函数
喜欢 (0)
[1034331897@qq.com]
分享 (0)