类方法继承中的C++类
C++ Class in class method inheritance
我有以下结构,我想从D调用foo。这怎么可能?我收到了错误消息,我在下面的行中对此进行了评论。
class A
{
protected:
class B
{
public:
B(x)
{
//...
}
protected:
virtual void foo()
{
//...
}
};
};
class C : public A
{
protected:
class D : public A::B
{
public:
D(x) : B(x)
{
//empty
}
};
void bar()
{
D var = D(x);
var.foo(); //cant access protected member in class A::B
}
};
foo()是B的受保护成员函数,意味着只允许从其子类(子类)调用foo(。
bar()是C的成员函数,C是A的继承。因此,C不是B的子类。
如果你把条形图放在D,那没关系。代码如下:
class A
{
protected:
class B
{
public:
B(int x)
{
//...
}
protected:
virtual void foo()
{
//...
}
};
};
class C : public A
{
protected:
class D : public A::B
{
public:
D(int x) : B(x)
{
//empty
}
// Here is OK, while D is subclass of B
void bar()
{
int x;
D var = D(x);
var.foo(); //cant access protected member in class A::B
}
};
// void bar()
// {
// int x;
// D var = D(x);
// var.foo(); //cant access protected member in class A::B
// }
};
int main(){
return 0;
}
试试朋友类。你可以让D成为B的朋友,这应该允许D调用foo()。
实际上,您正试图从类C
访问类D
==>的受保护方法您不能从类的外部访问受保护方法。
一种解决方案可以是将C
声明为D
的朋友类,以便C
可以访问受保护的方法:
// ...
class D : public A::B
{
public:
D(x) : B(x)
{
//empty
}
// Declare C as friend of D
friend class C;
};
// ...
添加友谊声明,您的代码将编译并按预期工作。
您可能希望foo()
在D
中是公共的,即使它在A::B
中受到保护
如果是,您可以在D
的定义中的public:
行之后添加以下行
using A::B::foo;
谢谢你的回答。公开foo函数确实是一个解决方案,但我确实希望foo只能从继承的类中获得。朋友修饰语是一种东西,很多人讨厌它,因为它让你可以访问一些东西,那是你不应该访问的。
但你们也是对的,我应该从D访问B::foo(在我的情况下,从构造函数访问不是一个选项)。我可以创建一个函数,它调用原始的foo,所以我的解决方案是:
class A
{
protected:
class B
{
public:
B(x)
{
//...
}
protected:
virtual void foo()
{
//...
}
};
};
class C : public A
{
protected:
class D : public A::B
{
public:
D(x) : B(x)
{
//empty
}
Dfoo()
{
B::foo();
}
};
void bar()
{
D var = D(x);
var.Dfoo();
}
};
这个解决方案很简单,但我不知道一个函数(不是静态的)可以这样调用:)
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 如何在QT Creator上将QWidget声明为继承类的对象