繁体   English   中英

C++子类改变父类的构造函数

[英]C++ Child Class Change Parent Class's Constructor

稍微修改了一下问题,感谢您的帮助!

有没有办法在初始化 Child 类时更改 Parent 的构造函数(例如更改受保护字段的值)。

例如,我有两个类 - Base 和 Child 下面。 在 Base 构造函数中,字符串 'a' 将被分配给受保护的字段 - 'a_' 和 'val'(例如,如果 a 是“str”,则 a_ 是 'a',val 是 'a!')。

有一个继承类 Base 的 Child 类,构造函数接受两个参数 - 字符串 a 和 b。

我想要的是分配 'a+b+"!"' 给 val ,例如 a = "first",b = "second",然后 a_ 是 "first",b_ 是 "second",c 的值应该是 "first second! "

class Base {
   public:
     explicit Base(string a) : a_(a), val(a + "!"){};

   protected:
      string a_;
      string val;
}

class Child : public Base {
   public:
     explicit Child(String a, String b) : Base(a), b_(b)...
   
   protected:
      string b_;

}

您可以有 2 个构造函数:

public:
explicit Base(string a) : Base(a, a + "!") : { };
protected:
explicit Base(string a, string val) : a_(a), val_(val) { };

这样派生类可以不同地设置val

注意:您正在按值传递字符串。 最好通过引用和移动语义传递。 或者,如果您可以使用带有转发引用的更现代的 C++,因为您不必编写这么多不同版本的构造函数来涵盖所有情况。

你可以这样做。 通过提供公共 getter,您还可以对派生类和客户端隐藏实现细节,从而使这两个类更易于维护。 (我几乎从不使用受保护的成员)

#include <string>
#include <iostream>

// using namesapce std;  NO not recommended
// https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice

class Base
{
public:
    explicit Base(std::string a) : val(a) {};

    const std::string& get() const noexcept
    {
        return val;
    }

private:
    std::string val;
};

class Child : public Base
{
public:
    explicit Child(std::string a, std::string b) :
        Base(a + b)
    {
    }
};

int main()
{
    Child c("Hello", "World");
    std::cout << c.get();
    return 0;
}

在访问受保护的成员时,尝试对子或父使用 Reference 变量。

谢谢大家的回复。 经过重新考虑,我决定从基类和子类中提取一个基类(类'RealBase')。 我觉得 Child 类应该始终遵守父类中定义的规则(例如相同的属性、相同的方法等),否则最好提取一个包含共享属性的抽象基类。

这是代码示例:


class RealBase {
   public:
      RealBase(string a) : a_(a) {};

   protected: 
      string a_;

}

class Base : public RealBase {
   public:
     explicit Base(string a) : RealBase(a), val(a + "!"){};
   protected:
      string val;
}

class Child : public RealBase {
   public:
     explicit Child(String a, String b) : RealBase(a), b_(b), val_(a+b+"!) {};
   
   protected:
      string b_;
      string val;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM