C ++中的属性继承如何工作?

jkwill87

假设您想复制以下Python代码段:

class Base:
    name = "base"

    def announce(self):
        print(self.name)

class Derived(Base):
    name = "derived"

Base().announce()
Derived().announce()

...将输出:

"base"
"derived"

最初,您可能倾向于编写如下内容:

#include <iostream>
#include <string>

struct Base {
    std::string name = "base";
    void announce() {
        std::cout << name << std::endl;
    }
};

struct Derived : public Base {
    std::string name = "movie";
};

int main() {
    Base().announce();
    Derived().announce();
    return 0;
}

但是这里Derived.name只是阴影Base.name调用Derived.announce()引用Base.name并打印“ base”。

有什么办法可以实现这种行为?如果可能的话,最好没有类模板。

一些程序员哥们

C ++的工作方式不像Python(这并不奇怪,毕竟它们是两种非常不同的语言),并且在继承的类中定义的成员变量实际上定义了一个与父类的变量无关的新变量。

一种可能的解决方案是创建第二个(可能受保护的)Base构造函数,该构造函数将name用作参数,然后Derived类可以使用它来初始化成员:

struct Base {
    Base() = default;  // A defaulted default constructor

    std::string name = "base";
    void announce() {
        std::cout << name << std::endl;
    }

protected:
    explicit Base(std::string name)
        : name{ std::move(name) }  // Initialize the member
    {
    }
};

struct Derived : public Base {
    Derived()
        : Base("movie")  // Initialize the base class using the special constructor
    {
    }
};

Base需要默认的默认构造函数,因为如果您声明另一个构造函数,则编译器不会自动为您生成默认构造函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C#中,属性的属性继承失败

来自分类Dev

在C#中,如何在不可继承的类中更改属性的DefaultValue属性?

来自分类Dev

C ++多继承转换如何工作?

来自分类Dev

继承在 C# 中的工作原理

来自分类Dev

C#多个属性中的单个属性的继承

来自分类Dev

如何仅继承C ++中的成员函数?

来自分类Dev

如何在C#继承中使用属性?

来自分类Dev

这在c ++中如何工作?

来自分类Dev

#if宏在C中如何工作?

来自分类Dev

类中的继承。C ++

来自分类Dev

了解C ++中的继承

来自分类Dev

C ++中的列表继承

来自分类Dev

C中的“动态继承”

来自分类Dev

如何向C#解释使用继承属性而不是父代属性?

来自分类Dev

目标C:如何继承加载在父类中的类别方法?

来自分类Dev

如何在C ++中管理并行,依赖继承?

来自分类Dev

如何在Realm中实现继承(iOS,Objective C)

来自分类Dev

如何在C ++中访问DirectWrite继承的接口?

来自分类Dev

如何在Objective-C中防止继承?

来自分类Dev

在C#中,如何获得类与基类的继承距离?

来自分类Dev

如何在Realm中实现继承(iOS,目标C)

来自分类Dev

如何在C#中显示继承groupbox

来自分类Dev

如何读取 .txt 文件到 C++ 中的继承对象?

来自分类Dev

ios :: fmtflags如何在C ++中工作?setf()如何工作?

来自分类Dev

C ++中的反向迭代器如何工作

来自分类Dev

#include如何在C ++中工作?

来自分类Dev

如何使strcmp()在我的C程序中工作

来自分类Dev

非整数常量在C ++中如何工作?

来自分类Dev

“ Hello World”如何在C中工作