Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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++_Inheritance_Multiple Inheritance_Virtual Functions - Fatal编程技术网

C++ 多重继承类中的虚函数

C++ 多重继承类中的虚函数,c++,inheritance,multiple-inheritance,virtual-functions,C++,Inheritance,Multiple Inheritance,Virtual Functions,首先,如果这是一个新手问题,我表示歉意,但我是初学者。 我的问题是我认为钻石问题的变种 假设我有以下课程: class A{ public: virtual foo();}; class B{ public: foo();}; class C{ public: foo();}; class D: public A, public B, public C{ public: foo(); }; 我的问题是,是否可以从类D调用foo(),并让虚拟函数在A、B、C和D之间运行。我已经试过

首先,如果这是一个新手问题,我表示歉意,但我是初学者。 我的问题是我认为钻石问题的变种

假设我有以下课程:

class A{ public: virtual foo();};

class B{ public: foo();};

class C{ public: foo();};

class D: public A, public B, public C{
    public: foo();
};

我的问题是,是否可以从类
D
调用
foo()
,并让虚拟函数在
A
B
C
D
之间运行。我已经试过了,但是
d::foo()
函数覆盖了所有其他
foo()
函数

还是只有当你制定了一个1:2的继承计划时才有可能

class A{ public: virtual foo();};

class B: public A { public: foo();};

class C: public B { public: foo();};

class D: public C { public: foo();};

我问这个问题的原因是因为我希望能够在不同的类中构造
A
B
C
,而不必每次都构造
A
B
C
,但保留运行虚拟函数的可能性,而不必为每种情况调用
A::foo()
B::foo()
C::foo()
您必须实现类
D::foo
显式调用
A::foo()
B::foo()
C::foo()
。没有办法让它在每个父类上自动调用
foo()

这被称为函数重载,因此无法自动执行您想要的操作

你必须这样做:

#include <iostream>

class A {
 public:
  virtual void foo() {
    std::cout << "foo of A\n";
  }
};

class B {
 public:
  // virtual keyword is not needed,
  // but it's to write it so that you
  // remind the reader that foo is virtual
  virtual void foo() {
    std::cout << "foo of B\n";
  }
};

class C {
 public:
  virtual void foo() {
    std::cout << "foo of C\n";
  }
};

class D : public A, public B, public C {
 public:
  virtual void foo() {
    A::foo();
    B::foo();
    C::foo();
    std::cout << "foo of D\n";
  }
};

int main()
{
  D d_object;
  d_object.foo();
  return 0;
}
#包括
甲级{
公众:
虚拟void foo(){

std::cout“我的问题是,是否可以从类D调用foo(),并让虚拟函数在A、B、C和D上运行?”你是什么意思?你是在问是否可以调用D.foo()并让它同时调用A.foo()、B.foo()和C.foo()?是的bstar55。我想同时调用所有这些函数。因此,调用D.foo()会调用A.foo()、B.foo(),C.foo()和D.foo()。将问题更改为“尝试”,以减少混淆。感谢提供的指针。如果我理解正确,也可以在不声明虚拟函数的情况下构造此示例?只需重载函数foo()@hadroque是的。但是你可以删除
virtual
关键字并找出答案。我希望你现在明白为什么会发生这种情况。不客气。顺便说一句,我认为你问题中的-1对于初学者来说太多了,所以我投票支持平衡@hadroque.)