多级继承和纯虚拟函数
Multilevel Inheritance and Pure Virtual Functions
包含纯虚拟函数的类不能有对象。这就是我对纯虚拟函数的想法。我有下面的程序,它编译时没有任何错误。
#include<iostream>
using namespace std;
class Father {
public:
virtual void foo()=0;
};
class Son:public Father {
// Nothing here
};
int main() {
}
这是意料之中的事,因为这两个类都没有对象。但是,当我试图对包含纯虚拟函数的类进行多级继承时,下面的程序给了我错误。
#include<iostream>
using namespace std;
class Father {
public:
virtual void foo()=0;
};
class Son:public Father {
// Nothing here
};
class Grand_Son:public Son {
void foo() {
cout<<"nFunction foo From Grand_Sonn";
}
};
int main() {
Grand_Son x;
x.foo();
}
错误如下所示。
In function 'int main()':|
|error: 'virtual void Grand_Son::foo()' is private|
|error: within this context|
||=== Build finished: 2 errors, 0 warnings ===|
由于我继承了类Son
和Grand_Son
作为public
,因此出现了意外的错误。
是否可以对涉及纯虚拟函数的类进行多级继承
有什么建议吗?非常感谢。
class Grand_Son:public Son {
public:
---^^^^^^^
void foo() {
cout<<"nFunction foo From Grand_Sonn";
}
};
您尚未将foo
声明为公共-我在上面添加了它。
您在Grand_Son
的私有部分中有foo()
c++中class
的默认访问权限是private
,它与继承方式(public/private/protected/default)无关。
不仅如此,当你在这里使用一个具体的子类时,你实际上并没有使用这个例子的任何继承特征,所以它与虚拟无关。
class Grand_Son:public Son {
public: <------- This will fix your compiler problem.
void foo() {
cout<<"nFunction foo From Grand_Sonn";
}
};
或者,这应该有效,因为您将在基类上以多态方式使用该类,它将根据基类中的访问级别进行v表查找。在整个层次结构中,您应该与您的访问级别保持一致。
int main() {
Father* x = new Grand_Son();
x->foo();
}
您需要将Grand_Son中foo()的实现声明为public
。
这是完全无关的。必须在public:
语句之后在Grand_Son
类中声明foo()
函数。
默认情况下(即没有可见性限定符),类成员是私有的,因此编译器会告诉您不能访问成员函数,因为它具有私有可见性。
基于标准class.access.virt
使用所使用的表达式类型在调用点检查访问以表示调用memeber函数的对象。这个memeber函数在定义它的类中的访问是一般不知道。
这意味着在您的示例中,它将使用Grand_Son来检查memeber的可访问性。由于您没有将成员定义为public,因此它将是private(类成员默认为private)。它和公共继承没有关系。
并且将覆盖虚拟函数定义为私有函数对于设计目的也是有用的。想象一下,你有一个接口,它具有需要重写的公共虚拟功能。通过将派生类memeber函数实现为private,可以强制调用方使用接口而不是具体类型。
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数