Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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++11_Multiple Inheritance_Virtual Functions - Fatal编程技术网

C++ 根据姐妹类自动实现虚拟函数

C++ 根据姐妹类自动实现虚拟函数,c++,c++11,multiple-inheritance,virtual-functions,C++,C++11,Multiple Inheritance,Virtual Functions,是否有一种习惯用法可以用来帮助实现依赖于基类存在的虚拟函数?例如,我有 class B {/* some abstract interface. */}; class A { public: virtual B* getB() {return nullptr;} }; class C : public A, public B { public: B* getB() override {return this;} /* Implement B's interface here.*

是否有一种习惯用法可以用来帮助实现依赖于基类存在的虚拟函数?例如,我有

class B {/* some abstract interface. */};

class A
{
public:
  virtual B* getB() {return nullptr;}
};

class C : public A, public B
{
public:
  B* getB() override {return this;}

  /* Implement B's interface here.*/
};
我通常希望像这样实现
getB
——我是否可以避免对所有叶类重复这一点?我可能有一些像B这样的接口类


我知道这样做的一种方法是在C和B中实际上从A继承,但如果可能的话,我想保持B与A无关。

您可以在A中完成这一切:

class A
{
public:
    virtual B* getB() {return dynamic_cast<B*>(this);}
};
A类
{
公众:
虚拟B*getB(){return dynamic_cast(this);}
};

注意:
virtual
这里只是为了使类A具有多态性,这是使用
dynamic\u cast
的一个要求。我们不打算覆盖
getB()

您可以在一个:

class A
{
public:
    virtual B* getB() {return dynamic_cast<B*>(this);}
};
A类
{
公众:
虚拟B*getB(){return dynamic_cast(this);}
};

注意:
virtual
这里只是为了使类A具有多态性,这是使用
dynamic\u cast
的一个要求。我们不打算覆盖
getB()

这是以什么方式实现的“这种使用
动态\u cast
的要求?还是重写子类中的函数?C++11 5.2.7 Dynamic cast说“否则,v应该是指向多态类型的指针或左值”。这是“其他”情况之一。对于向下和交叉转换,源类型需要是多态的。
getB()
如果A有其他虚拟函数,它本身不需要是虚拟的。谢谢你,但是5.2.7/5(而不是你引用的/6)不包括这种情况吗?不。那一段包括了向上转换。这是怎么回事“这种使用
动态\u cast
的要求?还是重写子类中的函数?C++11 5.2.7 Dynamic cast说“否则,v应该是指向多态类型的指针或左值”。这是“其他”情况之一。对于向下和交叉转换,源类型需要是多态的。
getB()
如果A有其他虚拟函数,则其本身不需要是虚拟的。谢谢,但是5.2.7/5(而不是您引用的/6)中不包括这种情况吗?不。该段涵盖了向上转换。