C++动态类型重写方法
C++ dynamic type - overriding methods
正常覆盖将以这种方式工作:
class Fruit {
public:
string color();
};
string Fruit::color() {
return "Unkown";
};
class Apple : public Fruit {
public:
string color();
};
string Apple::color() {
return "Green";
};
现在,你可以这样称呼它:
Apple *apple = new Apple();
std::cout << apple->color();
这将输出Green
,这是正确的!然而,在以下情况下运行它(当然,这只是一个例子):
Apple *apple = new Apple();
printHealthy(apple);
// Method printHealthy:
void printHealthy(Fruit *fruit) {
std::cout << fruit->color();
};
这将输出Unkown
,我可以理解,因为你将Apple转换为Fruit,从而"替换"它的方法。但是我怎么还能知道它的真实颜色呢
要求:
- 我需要知道它的真正颜色是什么
- 我不能依赖
Apple
-类。将会有更多的Apple
,它们是在旅途中分配的 - 每个
Apple
-类(例如Tomato
,它们当然有不同的名称)都是Fruit
的一个子类 - 并不是每个类都实现所有方法。例如,可能有一个
Apple
,其颜色为"unkown",因此它不会覆盖该方法,而是运行Fruit
的方法
在基类中标记函数virtual
。
class Fruit {
public:
virtual string color();
};
您忘记了virtual
。将virtual
关键字添加到color
的声明中,代码将打印正确的颜色。C++将仅对声明为virtual
的函数执行动态查找。
color
方法应该是一个虚拟方法。
目前,color
方法不是虚拟的。编译器在编译时决定调用哪个方法。您想要的是在运行时根据类的实际类型执行此操作。
相关文章:
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 方法重写线程C++中的概念
- 如何强制从重写方法调用重写的方法基方法?
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- 在 C++ 中使用模板方法重写类方法
- 检查子类是否执行了方法重写
- C++方法重写和重载(编译器级别)
- 用模板方法重写虚拟方法
- 方法重写(没有虚拟方法或指针)是否被认为是多态性的一部分
- C++ - 方法重写未按预期表示
- 使用两种方法重写<<运算符
- C++阻止方法重写
- C++方法重写
- c++在具体类中强制方法重写
- 方法重载和方法重写的性能问题
- C++中的方法重写是否总是在派生类的标头中完成?
- 是否有更好的方法重写此代码片段
- 为什么静态方法重写基类非静态方法
- 方法重写