假设我有这个:
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个函数传递一个类来操作它。
答案 0 :(得分:2)
你在这里做的事情在某些时候会失败,因为派生类的大小比基类大,你在基类结束后写。上述写操作将覆盖属于另一个对象的内存。 您可以在基类中使用SetValue()方法,并在派生类中实现它。
答案 1 :(得分:2)
代码不起作用。即使在施放后,所有对象仍然是Base
,因为您将它们构建为基础。演员们只是说:嘿,我知道它是Derived<xxx>
,所以请你这样解释。你在这里不知道这一点,事实上你知道它不是Derived
。
要正确使用这些对象,您需要创建一个Derived<xxx>
然后再进行投射。如果您在此使用dynamic_cast
,则所有案例都应该返回为空Base
。
鉴于你想通过5个函数传递一个类&#34;你可能想要倒置设置。创建Derived<xxx>
个对象并将其保存为指向Base
的指针。这可以在没有应该铸造的情况下工作然后通过您的函数传递Base*
。多态性将保证一切正常。