C++ 多级继承与纯虚函数

C++ 多级继承与纯虚函数,c++,C++,包含纯虚函数的类不能有对象。这就是我关于纯虚函数的想法。我有下面的程序,它编译没有任何错误 #include<iostream> using namespace std; class Father { public: virtual void foo()=0; }; class Son:public Father { // Nothing here }; int main() { } 这些错误是意外的,因为我继承了类Son和Grand\u-Sonaspu

包含纯虚函数的类不能有对象。这就是我关于纯虚函数的想法。我有下面的程序,它编译没有任何错误

#include<iostream>

using namespace std;

class Father {
   public:
   virtual void foo()=0;
};

class Son:public Father {
  // Nothing here 
};

int main() {

}
这些错误是意外的,因为我继承了类
Son
Grand\u-Son
as
public

是否可以对涉及纯虚拟函数的类进行多级继承?

有什么建议吗?谢谢。

您在
Grand\u Son

C++中的中的默认访问是“代码>私有< /COD>,这与您继承的方式无关(public /私下/保护/默认)。< /P> 不仅如此,您实际上并没有使用这个示例的任何继承特性,因为您在这里使用的是一个具体的子类,所以它与虚拟无关

class Grand_Son:public Son {
    public: <------- This will fix your compiler problem.
    void foo() {
        cout<<"\nFunction foo From Grand_Son\n";
    }
};

您需要将您在grandson中的foo()实现声明为
public

类grandson:public-Son{
class Grand_Son:public Son {
   public:
---^^^^^^^
    void foo() {
        cout<<"\nFunction foo From Grand_Son\n";
    }
};
公众: ---^^^^^^^ void foo(){
cout这是完全无关的。您必须在
public:
语句之后在
Grand\u Son
类中声明您的
foo()
函数


默认情况下(即没有可见性限定符),类成员是私有的,因此编译器会告诉您无法访问成员函数,因为它具有私有可见性。

基于标准class.access.virt

使用所用表达式的类型在调用点检查访问 表示为其调用memeber函数的对象 memeber函数在其定义的类中的访问权限为 一般不知道

这意味着在您的示例中,它将使用Grand_Son检查memeber的可访问性。由于您没有将成员定义为public,因此它将是private(类成员默认为private)。它与public继承没有关系


并且将重写虚拟函数定义为private对于设计目的也很有用。假设您有一个具有需要重写的公共虚拟函数的接口。通过将派生类memeber函数实现为private,您可以强制调用方使用接口而不是具体类型。

vate,检查它是否真的在类的公共部分。它在基类中是公共的,但在
Grand\u Son
中不是。有趣的是,当使用
Father*x=new Grand\u Son;x->foo()
时,它是可以的,因为现在,foo()是通过父级访问的,父级是公共的。这可以用来强制执行foo只能通过多态性使用。
class Grand_Son:public Son {
    public: <------- This will fix your compiler problem.
    void foo() {
        cout<<"\nFunction foo From Grand_Son\n";
    }
};
int main() {
   Father* x = new Grand_Son();
   x->foo();
}
class Grand_Son:public Son {
   public:
---^^^^^^^
    void foo() {
        cout<<"\nFunction foo From Grand_Son\n";
    }
};