【问题标题】:get derived classes access the member data and functions of each other获取派生类访问彼此的成员数据和函数
【发布时间】:2015-01-22 13:37:25
【问题描述】:

如何让派生类访问彼此的成员数据和函数。这两个类都作为纯抽象从基类继承而来。

这是我的场景

class Base
{
public:
    virtual void do_something() = 0;
};

class Derived1 : public Base
{
public:
    virtual void do_something()
    {
        // need to use a2
        // need to use func
    }
private:
    int a1;
};

class Derived2 : public Base
{
public:
    virtual void do_something()
    {
        // need to use a1
    }
    void func(){}
private:
    int a2;
};

【问题讨论】:

  • 你这里没有任何推导。您忘记了基类子句。
  • 奇怪的想法...但是您可以在使用的类中存储所需类的引用/指针(对 Derived1 中的 Derived2 对象的引用等)。此外,您可以将您的类重写为模板类...
  • @SebastianRedl .. 我错过了。我更新了谢谢
  • 您为什么要这样做?如果您非常想访问它,可以将其作为参数传递给函数,或者您可以像在派生类中使用它们一样在基类中声明这些变量。
  • 第一:这是一个坏掉的设计。第二:你做不到。您的 Derived2 类没有成员 a1。就是这样!

标签: c++ inheritance


【解决方案1】:

您可能需要重新考虑您的设计。对于 Derived2 的对象,不会为 a1 分配内存,对于 a2 和 Derived1 也是如此。你问的相当于说,猫和狗都是动物,我想在狗中使用 cat::whiskers 。 你可能需要这个:

class Base
{
public:
    virtual void do_something() = 0;
};

class Derived : public Base
{
public:
     int a1;
     int a2;
     void func(){}
};
class Derived1 : public Derived 
{
public:
    virtual void do_something()
    {
        // can use a2 and func here
    }
};

class Derived2 : public Derived
{
public:
    virtual void do_something()
    {
        // need to use a1
    }
    void func() override {}
};

【讨论】:

  • 所以你在 Derived1 中有两个成员 a1。一个是 Derived1::a1,一个是 Derived::a1。您认为如何解决这个问题?
  • 它仍然是一个损坏的设计。如果成员 a1 仅与 Derived1 相关,那么基类应该如何声明这些成员?如果 a1&a2 与基类相关,为什么派生类只处理其中的一个子集?
  • @Klaus 要求本身就被打破了。我并没有试图给出正确的解决方案。事实上,我认为不可能根据他提出的要求给出正确的解决方案。我的解决方案将“适用”于他所说的确切场景。
  • 是的,这个问题只显示了一个带有完全损坏设计的损坏解决方案,此处已修复。我对 OP 的问题没有得到解答,所以没有人知道代码应该真正实现什么......
猜你喜欢
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
相关资源
最近更新 更多