【问题标题】:Multiple inheritance C++ - BaseA access BaseB variable from derived class多重继承 C++ - BaseA 从派生类访问 BaseB 变量
【发布时间】:2014-03-07 04:51:07
【问题描述】:

我有两个基类 - BaseA 和 BaseB 以及派生自 BaseA 和 BaseB 的派生类。

BaseB 定义了一个变量 int var(比如说)。 BaseA 可以访问变量 var 吗?

我尝试在 BaseA 中定义一个虚函数 - virtual int Variable() = 0 并定义 int Variable() { return var; } 在 BaseB 中。但这不起作用。

请告知实现这一目标的最佳方法是什么?

C 派生类有很多不同的实现,我想避免在每个派生类中定义 Set 函数。

谢谢。

示例代码 - http://ideone.com/hFjvua

#include <iostream>
using namespace std;

class A
{
public:
    int Add(int x) { return Get() + x; }
    virtual int Get() = 0;
};

class B
{
public:
    int Get() {return a;}
protected:
    int a;
};


class C : public A, public B
{
public:
    void Set(int x) { a = x; }
    //int Get() { return a; }
};

int main() {
    C c;
    c.Set(5);
    std::cout << c.Add(3) << std::endl;
    return 0;
}

【问题讨论】:

  • 1) 不,BaseA 将无权访问var,除非它的static 或有BaseB 指针

标签: c++ inheritance


【解决方案1】:

是和不是。

如果您在Derived 中覆盖来自BaseA 的方法,则这些方法确实可以访问BaseB::var。如果你不覆盖这些方法,BaseA 定义中的任何方法都不会知道BaseB

class A
{
public:
    virtual int Get() = 0;
};

class B
{
public:
    int a;
};

class C : public virtual A, public virtual B
{
public:
    int Get() { return a; }
};

Example

【讨论】:

  • 谢谢。有可能实现ideone.com/hFjvua。我问的原因 - > 至少有 20 个类,例如 C,我想避免到处定义 Get() 函数。
  • 使用您尝试的代码,不。函数A::GetB::Get 完全不相关。您需要在 B 中定义一个要覆盖的虚拟方法:ideone.com/gqHteb 然而,这仍然需要您在 C 中覆盖它。我的猜测是你真的不需要多重继承(因为 95% 的时间,它是不必要的) - 你应该仔细看看你的设计,以确保这确实是最好的路径。
猜你喜欢
  • 2016-05-23
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多