我现在对继承很困惑。我计划简单地覆盖变量的初始值。在下面的代码中,我只是继承基类并尝试获取它的名称,该名称在类中保存为字符串。我期望派生类可以覆盖该值,但它没有这样做。
我的预期输出是
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)
实施以下内容的正确方法是什么?
这听起来并不困难,但这实际上取决于您想要实现的目标。
我猜测我们只是询问一个对象它是什么类型,无论我们调用哪个接口:
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)
该列表绝不是详尽无遗的。
| 归档时间: |
|
| 查看次数: |
5888 次 |
| 最近记录: |