包含纯虚函数的类不能有对象。这是我对纯虚函数的看法。我有以下程序,它编译没有任何错误。
#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_Son\n";
}
};
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
。
是否可以使用涉及纯虚函数的类进行多级继承?
有什么建议吗?谢谢。
答案 0 :(得分:7)
class Grand_Son:public Son {
public:
---^^^^^^^
void foo() {
cout<<"\nFunction foo From Grand_Son\n";
}
};
您尚未声明foo
公开 - 我在上面添加了它。
答案 1 :(得分:6)
foo()
Grand_Son
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_Son\n";
}
};
或者这应该有效,因为您将在基类上以多态方式使用该类,它将根据基类中的访问级别执行v表查找。您应该在整个层次结构中与您的访问级别保持一致。
int main() {
Father* x = new Grand_Son();
x->foo();
}
答案 2 :(得分:4)
您需要在Grand_Son中将您的foo()实现声明为public
。
答案 3 :(得分:3)
这完全不相关。您必须在foo()
声明后在Grand_Son
课程中声明public:
函数。
默认情况下(即没有可见限定符),类成员是私有的,因此编译器会告诉您无法访问成员函数,因为它具有私有可见性。
答案 4 :(得分:1)
基于标准class.access.virt
使用所用表达式类型在呼叫点检查访问 表示调用memeber函数的对象。该 在定义它的类中访问memeber函数 一般不知道。
这意味着在您的示例中,它将使用Grand_Son来检查memeber可访问性。由于您没有将该成员定义为公共成员,因此它将是私有的(默认情况下,类成员是私有的)。它与公共继承没有关系。
将覆盖虚拟函数定义为private也可用于设计目的。想想你有一个具有公共虚拟功能的接口需要覆盖。您可以通过将派生类memeber函数实现为私有来强制调用者使用接口而不是具体类型。