C++ 多态性错误

C++ Polymorphism Error

本文关键字:错误 多态性 C++      更新时间:2023-10-16

我在C++中使用多态性来创建多态性的基本"族"。但是,在尝试创建儿子 boo 时,我遇到了错误:error C2512: 'Son' : no appropriate default constructor availableerror C2660: 'Son::Son' : function does not take 2 arguments ,这让我感到困惑,因为它们都是 Child 类的一部分,这需要两个参数

#include <iostream>
class Parent{
public:
    Parent(char* name) : Name(name){};
    char* Name;
    void Speak(void){
        std::cout << "I am a parent called " << Name << std::endl;
    }
};
class Child{
public:
    Child(Parent* parent, char* name) : par(parent), Name(name){};
    Parent* par;
    char* Name;
    virtual void Speak(void){
        std::cout << "I am a child, my name is " << Name << " and my parent's name is " << par->Name << std::endl;
    }
};
class Son : public Child{
public:
    void Speak(void){
        std::cout << "I am a son, my name is " << Name << " and my parent's name is " << par->Name << std::endl;
    }
};
int main(void){
    Parent Dad = Parent("James");
    Child Lisa = Child(&Dad, "Lisa");
    Son Boo = Son(&Dad, "Boo"); // Error here
    Dad.Speak();
    Lisa.Speak();
    Boo.Speak();
    getchar();
    return (0);
}

正如编译器指出的那样,您尚未为 Son 类提供有效的构造函数。尝试:

Son(Parent* parent, char* name) : par(parent), Name(name){};

编辑:正如dasblinkenlight指出的那样,由于这里的儿子没有任何自己的成员来初始化,你应该直接引用子类的构造函数。

Son(Parent* parent, char* name) : Child(parent, name) {}

这是因为没有用户定义构造函数的Son类派生自 Child ,它具有用户定义的构造函数,并且没有可以在没有参数的情况下调用的构造函数。

当C++构造对象时,必须调用构造函数。如果未定义构造函数,编译器将为您定义一个构造函数(如果可以)。在这种情况下,它无法执行此操作,因为它不知道将什么传递给基类的构造函数。

将构造函数添加到正确初始化ChildSon构造函数应该可以解决此问题:

Son(Parent* parent, char* name) : Child(parent, name) {}

从基类派生时,构造函数不是继承的。

这就是为什么您必须为 Son 提供一个构造函数