当我们具有纯虚函数租用时,如何初始化一个对象?

Jim*_*ani 3 c++ virtual initialization function

class A{
    public: virtual void getName() = 0;
};

class B: public A{
    public:
        B(int a){
            cout<< "B Name : " << a <<endl;
        }
        void getName() override { cout << "Class B" << endl; }
};

class C: public B{
    public:
      C(int a){
            cout<< "C Name : " << a <<endl;
        }
        void getName() override { cout << "Class C" << endl; }
};

int main()
{
    B *b = new B(10);
    b->getName();

    C *c = new C(20);
    c->getName();
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建Class BC.b 的对象,但这给了我这样的错误

main.cpp:31:15: error: no matching function for call to ‘B::B()’
       C(int a){
               ^
main.cpp:22:9: note: candidate: B::B(int)
         B(int a){
         ^ 
Run Code Online (Sandbox Code Playgroud)

谁能向我解释为什么会这样?为什么不创建类对象?

son*_*yao 6

此问题与virtual功能无关。

您必须在成员初始值设定项列表中指定B应使用的哪个构造函数来显式初始化基础子对象,否则,将使用的默认构造函数,但没有一个。(请注意,如果有一个用户定义的构造函数,则不会为生成默认的构造函数。)BBBBintB

对于无法默认初始化的成员(例如引用成员和const限定类型的成员),必须指定成员初始化程序。

例如

C(int a) : B(a) {
//       ^^^^^^
    cout<< "C Name : " << a <<endl;
}
Run Code Online (Sandbox Code Playgroud)