我在类C中定义了受保护的抽象虚方法myMethod()
。类D继承自C并定义myMethod()
。现在E类也继承自C并定义myMethod()
。所以我有这样的事情:
这看起来像这样
class C
{
protected:
virtual void myMethod() = 0;
}
class D : public class C
{
protected:
void myMethod() {/*Do something*/};
void anotherMethod();
}
class E : public class C
{
protected:
void myMethod() {/*Do something else*/};
}
现在如果在D::anotherMethod()
中我有一个指向E类对象的指针,那么我就不能调用E::myMethod()
。这里没有错:D和E有不同的层次结构,因此我不能从D中调用E::myMethod()
,即下面的代码不能编译预期:
void D::anotherMethod()
{
E* myE = new E();
myE->myMethod();
}
现在,如果我更改C的声明并使E::myMethod()
公开(同时将重写的方法保留在D和E protected
中),例如在下面的代码中,它将编译:
class C
{
public:
virtual void myMethod() = 0;
}
class D : public class C
{
protected:
void myMethod() {/*Do something*/};
void anotherMethod();
}
class E : public class C
{
protected:
void myMethod() {/*Do something else*/};
}
我只在C内部将public
更改为protected
,而不是在继承的D和E类中。
有谁知道它编译的原因以及它背后的逻辑是什么?
谢谢!
安托。
答案 0 :(得分:2)
我们可以使用C
接口,因为它是公开的:
E
界面受到保护,D
无法从E
访问,但可以从基类C
访问
如下:
class C
{
public:
virtual void myMethod() = 0;
};
class E : public C
{
protected:
void myMethod() {/*Do something else*/};
};
class D : public C
{
protected:
void myMethod() {/*Do something*/};
void anotherMethod(){
//C* myE = new E(); // does compile
E* myE = new E(); // doesn't compile
myE->myMethod();
}
};