当我们有纯虚函数层次结构时如何实例化一个对象?

How to Institiate an object in when we have pure virtual function hirerachy?

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();
}

我正在尝试创建 Class BC 的对象。但它给了我

的错误
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){
         ^ 

任何人都可以向我解释为什么会这样吗?为什么它不创建 class 对象?

此问题与virtual 功能无关。

您必须明确指定 B 的哪个构造函数应该用于初始化 member initializer list 中的基础子对象 B,否则,B 的默认构造函数将被使用但 B 没有。 (请注意,B 有一个采用 int 的用户定义构造函数,然后不会为 B 生成默认构造函数。)

For members that cannot be default-initialized, such as members of reference and const-qualified types, member initializers must be specified.

例如

C(int a) : B(a) {
//       ^^^^^^
    cout<< "C Name : " << a <<endl;
}

问题与任何父级的抽象性无关 class,这是因为您的 C 构造函数试图初始化父级 B class通过B 默认构造函数,它没有。

你需要"call"参数化B构造函数通过构造函数初始化列表

C(int a)
    : B(a)  // "Calls" the B constructor
{
}

可选择将默认构造函数添加到 B class。

B(int a){
        cout<< "B Name : " << a <<endl;
    }

构造C的时候,还要构造B。如果不指定如何初始化 sub class(通过初始化列表指定要调用的构造函数),则 base 是默认构造的,需要默认构造函数。

由于您为 B class 定义了构造函数,因此没有为 B 生成默认构造函数。您可以为 B 定义默认构造函数或指定 B(int a) 以通过初始化列表使用。

请注意,您可以创建 B 的对象而无需为基础 A 指定构造函数,因为 A class 生成了一个使用的默认构造函数。