【发布时间】:2019-04-06 22:22:36
【问题描述】:
我正在尝试为自己的目的扩展其他人的 API,并且我正在尝试在这种情况下了解类继承。
我已经编写了这个最小的程序:
#包括 类first_class { 上市: first_class() {}; }; 第二类:第一类{ 私人的: 整数y; 上市: int get_y() { 返回 y; } 第二类(){ y=99; } }; int main() { first_class* a = new first_class(); second_class* b = 新的 second_class(); int q = ((second_class*)a)->get_y(); printf("%d\n",q); int r = b->get_y(); printf("%d\n",r); }first_class 什么都不做,也没有成员。 second_class 继承自 first_class,但增加了一个私有成员 y 和一个 getter 函数 get_y();
当我在 second_class 的实例上调用 get_y() 时,它按预期工作。当我对已转换为 second_class 的 first_class 实例调用 get_y() 时,它返回 0。
这是应该的吗?是否所有仅限子类的成员变量都自动设置为零,还是编译器有时会执行的那些通常发生但实际上不保证的事情之一,它们实际上应该被视为未定义?
【问题讨论】:
-
((second_class*)a)->get_y();调用 未定义的行为 - 此时允许发生任何事情 -
请注意,通过编写测试无法确定程序是否具有未定义的行为。一开始就对这个项目抱有期望是错误的。
-
如果您正在学习 C++,请不要使用旧式转换,即
(second_class*)。请改用static_cast,dynamic_cast(使用多态类时)或reinterpret_cast(仅在需要时,大多数你做错了什么)。在这种情况下,您的旧式演员正在默默地进行reinterpret_cast操作。
标签: c++