我环顾四周,大多数问题涉及为什么要使用虚拟,多态性是什么等等。我在我的程序中遇到问题,我想知道为什么没有调用子函数以及如何在这种情况下实际 CALL 子函数。
我可以效仿我的问题:
#include <string>
#include <iostream>
#include <vector>
class BaseA {
public:
BaseA(const std::string &n)
: name(n)
{
}
virtual void print() const
{
std::string str("");
str += name;
std::cout << str << std::endl;
}
protected:
std::string name;
};
class BaseB : public BaseA {
public:
BaseB(const std::string &n, const std::string &v)
: BaseA(n), value(v)
{
}
void print() const
{
std::string str("");
str += name;
str += ' ';
str += value;
std::cout << str << std::endl;
}
private:
std::string value;
};
int main() {
std::vector<BaseA> vec;
vec.push_back(BaseA("cat"));
vec.push_back(BaseB("cat", "kitten"));
for(BaseA &obj : vec)
obj.print();
return 0;
}
为什么输出:猫猫?
如何将输出更改为&#34; cat cat kitten&#34;使用BaseB :: print()?
答案 0 :(得分:4)
正如rightføld所指出的,你是切片问题的受害者。但是,由于您的问题标记为C ++ 11,因此您可以利用std::unique_ptr
。
std::vector<std::unique_ptr<BaseA>> vec;
vec.push_back(std::make_unique<BaseA>("cat"));
vec.push_back(std::make_unique<BaseB>("cat", "kitten"));
for(std::unique_ptr<BaseA>& obj : vec)
obj->print();
不幸的是,在C ++ 14之前未添加std::make_unique
,您可以选择使用emplace_back
。
std::vector<std::unique_ptr<BaseA>> vec;
vec.emplace_back(new BaseA("cat"));
vec.emplace_back(new BaseB("cat", "kitten"));
for(std::unique_ptr<BaseA>& obj : vec)
obj->print();