关于#c++#的问题:构造函数不是不能继承吗,为什么创建对象C调用了其基类A的构造函数

img

构造函数不是不能继承吗,为什么创建对象C调用了其基类A的构造函数?

空类包含 无参构造,析构,拷贝构造,赋值操作符重载

class Ex
{
};

等价于

class Ex
{
public:
  Ex() = default;
  ~Ex() = default;
  Ex(const Ex & rhs) = default;
  Ex & operator=(const Ex & rhs) = default;
}

构造函数会首先调用基类的构造

这不是继承的,而是子类在调用构造函数初始化,会首先调用父类的构造函数进行初始化,然后再继续执行子类的构造函数
这里因为是无参的构造函数,所以调用父类构造函数的操作,可以省略不写

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7642966
  • 这篇博客你也可以参考下:C语言/C++常见习题问答集锦之哆啦A梦
  • 除此之外, 这篇博客: 大话设计模式 附录A 面向对象基础 C++实现中的 A.3. 构造函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    给猫取一个名字, 需要设置Name变量, 所以需要自己定义构造函数.

    #include <string>
    class Cat
    {
    public:
        Cat(){Name=L"无名";}
        Cat(std::wstring name){Name=name;}
        std::wstring Shout()
        {
            return std::wstring(L"我的名字叫")+Name+std::wstring(L" 喵~");
        }
    protected:
    private:
        std::wstring Name;
    };
  • 以下回答来自chatgpt:

    回答:

    对于C++中构造函数继承的疑问,可以说构造函数本身是不继承的,但是在派生类的构造函数中可以显式调用基类的构造函数,这样就可以实现子类中调用父类构造函数的目的。具体可以按照以下步骤实现:

    1. 在派生类的构造函数中使用基类名显式调用基类的构造函数,如下:
    class Base {
    public:
        Base(int a) { /* 构造函数实现 */ }
    };
    class Derived : public Base {
    public:
        Derived(int a, int b) : Base(a) { /* 构造函数实现 */ }
    };
    

    在派生类Derived的构造函数中,可以使用Base(a)来初始化基类的对象。

    1. 如果在派生类的构造函数中没有显式调用基类的构造函数,则会自动调用基类的默认构造函数,如果没有默认构造函数,则会报错。

    以上是实现子类调用父类构造函数的方法,通过显式调用基类的构造函数来初始化基类对象。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^