继承示例没有打印预期的结果
inheritance example not printing expected results
尝试记住基本的c++内容(已经很长时间了),并玩编译器。我创建了一个简单的基/子继承示例。
我希望下面的代码输出
index 0 is 0
index 1 is 1
index 2 is 2
,而不是得到:
index 0 is 0
index 1 is 2
index 2 is 0
谁能指出我明显犯的错误?
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
class Base
{
public:
Base(){x=0;}
int x;
};
class Derived : public Base
{
public:
Derived() { y=0;}
int y;
};
// practicing operator definition syntax
ostream& operator<<(ostream& ostr, const Base& base)
{
ostr << base.x << endl;
ostr << flush;
return ostr;
}
void init(Base *b)
{
for (int i = 0; i<3; i++)
{
b[i].x=i;
}
};
int main(int argc, char** argv)
{
Derived arr[3];
init(arr);
for (int idx = 0; idx< 3; idx++)
{
cout << "index is " << idx << ' ' << arr[idx] << endl;
}
return 0;
}
数组和多态性不能在c++中混合使用。
Derived
和Base
对象的大小不同,程序中涉及的任何指针运算都将失败。
你的init
方法是在Base
对象中切片Derived
对象。下面的赋值有未定义的行为,它在Derived
对象的某个地方设置了一些字节。
考虑使用std::vector<std::unique_ptr<B>>
作为替代
而且,您的Base
类缺少其虚拟析构函数,稍后调用更多未定义行为。
派生类型的数组不是基类型的数组!尽管指向派生对象的指针可转换为指向基类对象的指针,但不能将基类指针用作指向基类对象数组的指针。
原因很简单:当你做一个像array[i]
这样的操作时,编译器会把它翻译成*(array + i)
,而内部地址算术是像array + sizeof(T) * i
这样做的,其中T
是array
的静态类型。现在,对于从基类型B
派生的类型D
,它通常保持sizeof(B) < sizeof(D)
。因此,如果将派生对象的数组视为基于对象的数组,则索引算法最终将访问对象中或多或少随机位置的元素。
相关文章:
- C++使用 g++ 时,没有结果,没有打印
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- cout 打印不准确的结果,printf 打印准确的结果
- 读取一组用户输入,按升序排序,然后打印结果
- 无法打印正确的结果
- 为什么C++打印出奇怪的结果的最小值?
- 对象指针打印结果以相反的顺序进行
- 硬编码字符串与强制转换为 PUCHAR 并打印到控制台时从控制台读取的字符串的结果不同
- 尝试以随机字符(长读取)打印字符串返回结果
- GetTempPathA 函数在打印结果后崩溃
- 我定义的反向函数不是打印结果
- 声明双重给它一个值0,但打印结果意外变化
- 打印整数指针元素时的结果不同
- 如何打印返回值的结果?我是一个初学者学习C++
- COUT没有打印出预期的结果
- 如何在VS 2017 C++Win32应用程序中打印出gethostname结果
- 我的程序打印出与预期不同的结果
- 尝试将二进制数组转换为十六进制C++然后打印结果
- 在WINDBG中调用C 方法实例并打印结果
- 井字游戏-如何没有无效输入后的结果打印