覆盖基类成员变量的初始值

hr0*_*r0m 5 c++ inheritance

我现在对继承很困惑。我计划简单地覆盖变量的初始值。在下面的代码中,我只是继承基类并尝试获取它的名称,该名称在类中保存为字符串。我期望派生类可以覆盖该值,但它没有这样做。

我的预期输出是

Derived
Derived
Run Code Online (Sandbox Code Playgroud)

不过我得到

Base
Base
Run Code Online (Sandbox Code Playgroud)

实施以下内容的正确方法是什么?

#include <iostream>
#include <string>

struct Base {
    virtual ~Base() = default;
    virtual void id(){
        std::cout << id_ << std::endl;
    }
    std::string id_ = "Base";
};   



struct Derived : public Base {
    virtual ~Derived() = default;
    std::string id_ = "Derived";
};   


int main(){
    Base* b = new Derived();
    Derived* d = new Derived();
    b->id();
    d->id();
    delete d;
    delete b;                                                                                                          
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*ges 4

实施以下内容的正确方法是什么?

这听起来并不困难,但这实际上取决于您想要实现的目标。

我猜测我们只是询问一个对象它是什么类型,无论我们调用哪个接口:

struct Base {
  virtual ~Base() = default;

  virtual const std::string id() const {
    return "Base";
  }
};

struct Derived : Base {
  virtual const std::string id() const override {
    return "Derived";
  }
};
Run Code Online (Sandbox Code Playgroud)

这是另一种方法:

struct Base {
  virtual Base(std::string ident = "Base") 
  : _id(std::move(ident))
  {}

  virtual ~Base() = default;

  std::string& id() const {
    return _id;
  }

private:
  std::string _id;

};

struct Derived : Base {
  Derived() : Base("Derived") {}
};
Run Code Online (Sandbox Code Playgroud)

另外,使用 value 是接口,但请注意,这将禁用赋值运算符

struct Base {
  virtual Base(std::string ident = "Base") 
  : id(std::move(ident))
  {}

  virtual ~Base() = default;

  const std::string id;

};

struct Derived : Base {
  Derived() : Base("Derived") {}
};
Run Code Online (Sandbox Code Playgroud)

该列表绝不是详尽无遗的。