【发布时间】:2021-09-05 01:36:37
【问题描述】:
所以我刚刚学习了矢量模板的基础知识,我正在尝试制作一个同时包含 Base 对象和 Derived 对象类的矢量。但是派生对象会被切片(仅打印 baseVariable,尽管它也应该打印 DerivedVariable。所以我有两个问题,首先: 是否在此处正确完成了使用用户输入创建新对象?我可以让它更好或更短吗?
Base* ptr = new Base();
cin >> *ptr;
vec.push_back(unique_ptr<Base>(ptr));
为什么派生对象会被切片?
class Base
{
protected:
string baseVariable_;
public:
void display() {
cout << "BaseVar: " << baseVariable_ << endl;
}
friend istream& operator>>(istream& in, Base& obj);
};
istream& operator>>(istream& in, Base& obj)
{
in >> obj.baseVariable_;
return in;
}
class Derived :public Base
{
public: //public just for test
string derivedVariable_;
void display() {
Base::display();
cout << "DerivedVar: " << derivedVariable_ << endl;
}
friend istream& operator>>(istream& in, Derived& obj);
};
istream& operator>>(istream& in, Derived& obj)
{
in >> obj.baseVariable_>> obj.derivedVariable_;
return in;
}
int main()
{
unsigned int choice = 0;
vector<unique_ptr<Base>>vec;
while (true)
{
cout << endl << "1. Add object of base class" << endl;
cout << endl << "2. Add object of derived class" << endl;
cout << endl << "3. Display all added objects to vector";
cout << endl << "Choose option: ";
cin >> choice;
switch (choice)
{
case 1:
{
Base* ptr = new Base();
cin >> *ptr;
vec.push_back(unique_ptr<Base>(ptr));
break;
}
case 2:
{
Derived* ptr = new Derived();
cin >> *ptr;
vec.push_back(unique_ptr<Base>(ptr));
//delete ptr; <- it can't be here.
break;
}
case 3:
cout << "Displaying...\n";
for (size_t i = 0; i < vec.size(); i++)
{
vec[i]->display();
}
cout << "---------------------\n";
break;
}
}
}
【问题讨论】:
-
Derived对象将在vec销毁时被切片,因为Base析构函数不是virtual -
请阅读minimal reproducible example。您的代码缺少包含,更重要的是缺少示例输入、输出和预期输出。我冒着风险写了一个答案,但我无法确定它是否能解决你的问题,因为我无法找到有意义的输入,而且我不知道什么是错误/正确的输出
-
确实有帮助,谢谢。
标签: c++ vector derived-class