C++;虚拟方法混淆 我有一个关于继承和虚方法的基本C++问题。
请注意此代码:C++;虚拟方法混淆 我有一个关于继承和虚方法的基本C++问题。,c++,inheritance,methods,virtual,C++,Inheritance,Methods,Virtual,请注意此代码: #include <iostream> #include <vector> using namespace std; class A { public: virtual void f() {cout << "A\n";}; }; class B : public A { public: void f() {cout << "B\n";}; }; int main() { A a; B b; vector&l
#include <iostream>
#include <vector>
using namespace std;
class A {
public:
virtual void f() {cout << "A\n";};
};
class B : public A {
public:
void f() {cout << "B\n";};
};
int main() {
A a;
B b;
vector<A> v;
v.push_back(a);
v.push_back(b);
for (int i = 0; i < v.size(); ++i)
v.at(i).f();
}
我不明白它为什么不打印
A
B
因为“f”方法被声明为虚拟的。
我想知道为什么程序会以这种方式运行
提前感谢您就是对象,您需要使用指针,或者让它正常运行。使用指针的示例:
int main()
{
vector<A*> v;
v.push_back(new A);
v.push_back(new B );
for (int i = 0; i < v.size(); ++i)
v[i]->f();
}
您就是对象,您需要使用指针或命令才能正常运行。使用指针的示例:
int main()
{
vector<A*> v;
v.push_back(new A);
v.push_back(new B );
for (int i = 0; i < v.size(); ++i)
v[i]->f();
}
你应该有指针向量才能有多态行为:)你应该有指针向量才能有多态行为:)你的向量包含
A
对象:
vector<A> v;
这称为。向量包含
A
对象:
vector<A> v;
这被称为。
b
被切片为A
的一个实例。当它被复制以插入向量
时,您必须使用向量
才能按预期工作。b
被切片为A
的一个实例,当它被复制以插入向量
时,你必须使用<代码>向量< /> >以达到预期的效果。C++中,只有指针和对象引用行为多态。向量包含类型A的非多态对象
试一试intmain(){
A A;
B B;
向量v;
v、 向后推(&a);
v、 向后推(&b);
对于(int i=0;if();
但您需要注意,当A和B被破坏时(当它们超出范围)时,这些指针将变得无效。C++中的
< P>,只有指针和对象引用行为多态。 试一试intmain(){
A A;
B B;
向量v;
v、 向后推(&a);
v、 向后推(&b);
对于(int i=0;if();
尽管您需要知道,当a和b被销毁时(当它们超出范围时),这些指针将变得无效.向量v包含类型A的对象。当您将对象推回v时,这些对象将使用A的复制构造函数实例化。就像您稍后在函数f中调用的每个对象实际上都是类型A,并且永远不会执行B的f().向量v包含类型A的对象。当您将对象推回v时,这些对象将使用A的复制构造函数实例化。就像您稍后在函数f中调用的每个对象实际上都是类型A,并且永远不会执行B的f().Read about.Read about.您可以使用std::vector a;作为Anatoly,您可以使用共享指针以避免摆脱对象的麻烦(仅在动态分配的情况下!),或者您可以使用原始/经典的指针,但确保仅当指针指向有效对象时(例如,在堆栈展开后)才使用数组您可以使用std::vector a;作为Anatoly,您可以使用共享指针以避免摆脱对象的麻烦(仅在动态分配的情况下!),也可以使用原始/经典指针,但确保仅当指针指向有效对象时(例如,在堆栈展开后)才使用数组啊,我明白了。我发现这种行为非常令人困惑,可能是因为我来自Java世界…@SvenHager对,这就是你的值语义。在Java“对象”中是一种指针/引用,向量的等价物将保留这些引用,因此有动态调度的范围。在C++中,你会将智能指针存储到基类中来实现相同的结果。我明白了。我发现这种行为非常混乱,可能是因为我来自java世界…@ SvHaGer-On,这是值语义。在爪哇中,“对象”是一种指针/引用,向量的等价物将保存这些引用,因此有动态调度的范围。在C++中,你会将智能指针存储到基类中,以实现相同的。
A a;
B b;
a = b;
a.f();
int main() {
A a;
B b;
vector<A*> v;
v.push_back(&a);
v.push_back(&b);
for (int i = 0; i < v.size(); ++i)
v.at(i)->f();