C++ C++;设计问题

C++ C++;设计问题,c++,inheritance,oop,constructor,C++,Inheritance,Oop,Constructor,假设我有一个类基,它有一个成员变量a*my\u hash。 我还有一个从类基继承的扩展类。我还有一个B班 这扩展了A class Base{ Base(): my_hash(new A) {} //methods which use my_hash protected: A* my_hash; }; class Extended:public Base{ //methods which use my_hash from A //I cannot have a B* my_ot

假设我有一个类基,它有一个成员变量a*my\u hash。 我还有一个从类基继承的扩展类。我还有一个B班 这扩展了A

class Base{
  Base(): my_hash(new A) {}
  //methods which use my_hash
protected:
  A* my_hash;

};

class Extended:public Base{
 //methods which use my_hash from A
 //I cannot have a B* my_other_hash in this class
 //I would like to substitute B* my_hash
 //I cannot let Base create my_hash (of type A*) because that is not what I want.
};
我希望扩展到通常的方式(即使用它从A继承的所有内容),除了 还有一个重要的区别,我希望我的_散列是B*而不是A*
每当有东西通过Extended的方法或Base的方法访问my_hash时, 我希望执行的方法是B*

有一件事可以尝试: 我不能有我在Extended()中重新定义的方法调用(例如在Base()中创建_hash())。 这不起作用,因为当我创建散列时,似乎没有办法返回到扩展的类


我甚至不想让Base知道B。我如何做到这一点?

您可以在a上将基类制作成模板:

template<typename T>
class Base{
  Base(): my_hash(new T) {}
  //methods which use my_hash
protected:
  T* my_hash;

};

class Extended:public Base<B>{
 ...
};
模板
阶级基础{
Base():my_hash(new T){
//使用my_散列的方法
受保护的:
我的杂凑;
};
扩展类:公共基{
...
};

您可以在以下位置将基类制作成模板:

template<typename T>
class Base{
  Base(): my_hash(new T) {}
  //methods which use my_hash
protected:
  T* my_hash;

};

class Extended:public Base<B>{
 ...
};
模板
阶级基础{
Base():my_hash(new T){
//使用my_散列的方法
受保护的:
我的杂凑;
};
扩展类:公共基{
...
};

如果“B”的类型扩展了“A”,那么您可以对其进行设置,以便通过构造函数传递“m_hash”的值(您还可以将此构造函数隐藏为受保护的,以便不从“Base”继承的代码不能扩展它)

e、 g


此外,如果您希望在“B”中使用新的专门函数,可以从“Extended”调用,那么您可以将其存储在另一个指针中,或者将“my_hash”强制转换为类型“B*”。

如果“B”的类型扩展了“A”,那么您可以设置它,以便通过构造函数传递“m_hash”的值(您还可以将此构造函数隐藏为受保护的,以便不从“Base”继承的代码无法扩展它)

e、 g


此外,如果您希望在“B”中使用新的、专门的函数,您可以从“Extended”调用这些函数,那么您可以将其存储在另一个指针中,或者直接将“my_hash”强制转换为键入“B*”。

正如AutoCompulated所建议的那样,模板可能是实现此目的的方法。另一种方法实际上是使用B*my_other_hash(如您在问题中提到的),然后在B的ctor中将my_other_哈希设置为my_哈希

class Extended:public Base{
    ExtendedBase(): Base() {
        my_other_hash = my_hash;
    }
}

然后,您可以访问Base中的A方法和Extended中的A或B方法。请确保仅删除其中一个!在Base的dtor中或在层次结构之外(如果您管理其他位置的内存)。

模板可能是实现此目的的方法,正如AutoCompulated所建议的那样。另一种方法实际上是使用B*my\u other\u散列(就像你在问题中提到的),然后在B的ctor中将my_other_散列设置为my_散列

class Extended:public Base{
    ExtendedBase(): Base() {
        my_other_hash = my_hash;
    }
}

然后,您可以访问Base中的A方法和Extended中的A或B方法。确保只删除其中一个!在Base的dtor中或在层次结构之外(如果您在其他地方管理内存)。

您可能还需要一个“typedef Base RealBase”或类似的名称(更可能将Base重命名为BasicBase或其他名称)。您可能还需要一个“typedef Base RealBase”或类似的东西(更可能将Base重命名为BasicBase或其他东西。)B是从A派生出来的吗?或者:B与A有任何关系吗?@Federico:它在第一段中“我还有一个扩展了A的类B。“根据下面的答案,确保类A中有虚拟方法,这样,如果通过类A的指针调用该方法,就会执行B的方法。B是从A派生的吗?还是:B与A有关?@Federico:it在第一段“我还有一个扩展了A的类B。”使用下面的答案,确保类A中有虚拟方法,这样如果通过类A的指针调用该方法,就会执行B的方法。