c++ - 将属性传递给基类的机制

标签 c++ oop derived-class

有什么机制可以将属性从派生类传递到基类,以便:

  • Base ctor可以访问它们。
  • 它们可以轻松地存储在STL容器中。
  • 外部的任何人都可以访问它们,只能在派生类上“看到”。
  • 有效性不是很有值(value)。

  • 属性是一个与派生类的每个对象相关的常数。

    最佳答案

    如果您的问题是“将属性从派生类传递到基类的机制是什么?”有两种方法可以做到这一点。

  • 最常见的方法是通过成员初始化程序列表
  • 初始化父类

    #include <iostream>
    
    class Base
    {
    public:
        Base(const char *a)
        {
            std::cout << a << std::endl;
        }
    };
    
    class Derived : public Base
    {
    public:
        Derived(const char *a)
        : Base{a} { }
    };
    
    int main()
    {
        Derived d{"Parent initialization through member initializer list"};
        // console output: Parent initialization through member initializer list
    }
    
  • 使用键工作
  • 获取构造函数继承

    #include <iostream>
    
    class Base
    {
    public:
        Base(const char *a)
        {
            std::cout << a << std::endl;
        }
    };
    
    class Derived : public Base
    {
    public:
        using Base::Base;
    };
    
    int main()
    {
        Derived d{"Parent class initialization through constructor inheritance"};
        // console output: Parent class initialization through constructor inheritance
    }
    
    用模板类看一个有用的例子
    #include <iostream>
    #include <vector>
    
    template<class T>
    class custom_vector : public std::vector<T>
    {
    public:
        // I will inherit all std::vector constructors
        using std::vector<T>::vector;
        // ...
    };
    
    int main()
    {
        // Inizializer list constructor
        custom_vector<int> v{1, 2, 3, 4, 5};
        for (auto x : v) std::cout << x << std::endl;
        // 1 2 3 4 5
     
        // Fixed-allocation with default value constructor
        custom_vector<char> v2(10, 'A');
        for (auto x : v2) std::cout << x << std::endl;
        // A A A A A A A A A A
    }
    
    如果没有使用std::vector ::vector 的,我将不会继承std::vector构造函数。
    在您的示例中,我注意到一些设计缺陷
  • 虚拟函数不用于将属性传递给基类
  • 我不明白您为什么提到模板
  • 您不应该重复virtual关键字,因为它在派生类中已经是虚拟的,可以使用override关键字。
  • 通常不建议使用部分实现的抽象类,您应该考虑从BaseVehicle中删除m_image和m_speed。在某些情况下,在抽象类中进行一些实现实际上是有用的,但只有在有充分理由的情况下才这样做。
  • 在抽象类的构造函数中具有类似* table.registerVehicle(this,number)的语句是一种不良的设计症状。
  • 关于c++ - 将属性传递给基类的机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63490306/

    相关文章:

    javascript - 当我尝试以 Javascript OOP 样式编写代码时,Append 不起作用

    java - 如何更好地初始化工厂中的对象?

    javascript - 如何从构造函数返回单个数组项

    c++ - 如何编写一个空类,初始化另一个类的三个对象

    c++ - 通过 "a pointer of the base class"访问未在基类中声明的子类的方法或属性(动态)

    c++ - 与 C++ 2011 不相关的并行随机种子?

    c++11 std::thread 使用函数编译,但不使用类

    c++ - 下次使用该功能时,计数器会被窃听

    swift - swift 中带有派生类的便捷初始化器

    c++ - MFC中如何嵌套不同的资源文件?