【发布时间】:2016-08-13 14:33:32
【问题描述】:
我想制作一个包含父元素和子元素的向量。我只用一个孩子测试了我的代码,效果很好。但是当我再添加一个孩子 (Child2) 时,我发现了一个问题。
当我尝试获取px 的值时,预期输出为:5 7 11,但我得到type 变量的值(2);
Main.cpp
#include <SFML/Graphics.hpp>
#include "Helper.h"
#include <vector>
#include <iostream>
using namespace sf;
int main() {
std::vector<Parent*> arr1;
arr1.push_back(new Child(3, 4, 5, 6));
arr1.push_back(new Parent(7, 8));
arr1.push_back(new Child2(9, 10, 11, 12));
std::cout << static_cast<Universal*>(arr1.at(0))->dx << std::endl;
std::cout << static_cast<Universal*>(arr1.at(1))->x << std::endl;
std::cout << static_cast<Universal*>(arr1.at(2))->px << std::endl;
return 0;
}
Helper.cpp
#include "Helper.h"
Parent::Parent(int x, int y) {
this->x = x;
this->y = y;
}
Child::Child(int x, int y, int dx, int dy) : Parent(x, y) {
this->dx = dx;
this->dy = dy;
}
Child2::Child2(int x, int y, int px, int py) : Parent(x, y) {
this->px = px;
this->py = py;
}
Universal::Universal(int x, int y) : Parent(x, y) {}
Helper.h
class Parent {
public:
int x, y;
int type = 0;
Parent(int x, int y);
};
class Child : public Parent {
public:
int dx, dy;
int type = 1;
Child(int x, int y, int dx, int dy);
};
class Child2 : public Parent {
public:
int px, py;
int type = 2;
Child2(int x, int y, int px, int py);
};
class Universal : public Parent {
public:
int dx, dy, px, py;
Universal(int x, int y);
};
【问题讨论】:
-
你的
static_cast<Universal*>有UB。 -
将原始指针存储在
std::vector(或任何 STL 容器)中几乎总是一个坏主意。请改用std::vector<std::unique_ptr<Parent>>。 -
@Jarod42 ,什么是 UB?
-
未定义的行为。
-
您声称
Parent、Child1和Child2是Universal,但它们不是。
标签: c++ inheritance casting