Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;虚拟方法混淆 我有一个关于继承和虚方法的基本C++问题。_C++_Inheritance_Methods_Virtual - Fatal编程技术网

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();