通过将基类强制转换为派生并设置数据来扩展基类

时间:2013-11-25 17:05:47

标签: c++ pointers casting

假设我有这个:

class Base {
public:
    int a;
    Base() : a(5) {}
};

template<class T>
class Derived : public Base {
public:
    T value;
};

下面的代码有效,但我想知道使用这种方法可能遇到的挑战:

Base * base = new Base;
Derived<int> * derived = static_cast<Derived<int>*>(base);
derived->value = 5;
Derived<String> * derived1 = static_cast<Derived<String>*>(base);
derived1->value = "test";

Derived<String> * newderived = static_cast<Derived<String>*>(base);
std::cout << newderived->value;
Derived<int> * newderived1 = static_cast<Derived<int>*>(base);
std::cout << newderived1->value;
//Output: test1

或者我怎样才能以不同的,更安全的方式实现这样的目标。我想通过5个函数传递一个类来操作它。

2 个答案:

答案 0 :(得分:2)

你在这里做的事情在某些时候会失败,因为派生类的大小比基类大,你在基类结束后写。上述写操作将覆盖属于另一个对象的内存。 您可以在基类中使用SetValue()方法,并在派生类中实现它。

答案 1 :(得分:2)

代码不起作用。即使在施放后,所有对象仍然是Base,因为您将它们构建为基础。演员们只是说:嘿,我知道它是Derived<xxx>,所以请你这样解释。你在这里不知道这一点,事实上你知道它不是Derived

要正确使用这些对象,您需要创建一个Derived<xxx>然后再进行投射。如果您在此使用dynamic_cast,则所有案例都应该返回为空Base

鉴于你想通过5个函数传递一个类&#34;你可能想要倒置设置。创建Derived<xxx>个对象并将其保存为指向Base的指针。这可以在没有应该铸造的情况下工作然后通过您的函数传递Base*。多态性将保证一切正常。