c++设计(基类中的行为,派生类中提供的私有成员)
C++ Design (behavior in base class, private member supplied in derived class)
我有6类都执行相同的动作。我想把共同的行为移到共同的[基]类中。
有6个单独的对象要执行的操作。这六个对象位于派生类中。直观地说,私有成员对象可以通过基类中的子类(派生类)来访问。
我正在寻找的c++模式是什么?
class Base
{
// Common behavior, operate on m_object
...
void Foo()
{
m_object.Bar();
}
};
class Derived1 : public Base
{
// No methods, use Base methods
private:
MyObject1 m_object;
}
class Derived2 : public Base
{
// No methods, use Base methods
private:
MyObject2 m_object;
}
使我陷入这种情况的是MyObject1
, MyObject2
等提供Bar()
,但不共享公共基类。我真的无法修复派生,因为对象来自外部库。
如果在派生类中引入它们,则基类不能直接访问它们。基类如何知道所有派生类都有一个特定的成员?
你可以像这样使用虚拟保护方法:
class my_base
{
protected:
virtual int get_whatever();
virtual double get_whatever2();
private:
void process()
{
int y = get_whatever();
double x = get_whatever2();
//yay, profit?
}
}
class my_derived_1 : my_base
{
protected:
virtual int get_whatever()
{
return _my_integer;
}
virtual double get_whatever2()
{
return _my_double;
}
}
另一种可能性(如果您想从派生类调用基方法)是简单地向基方法提供参数。
class my_base
{
protected:
void handle_whatever(int & arg);
};
class my_derived : my_base
{
void do()
{
my_base::handle_whatever(member);
}
int member;
};
c++有和没有。它具有非常强大的多重继承支持,因此没有super
关键字。为什么?假设您的基类由另外两个类继承,或者甚至是虚拟继承层次结构的一部分。在这种情况下,你不能真正告诉super
应该是什么意思。另一方面,有虚拟方法,您总是可以在基类中拥有它们并在派生类中实现(这就是像Java这样的语言所做的,除了它们没有多个类继承支持)。如果您不想使用多态性,您可以使用如下内容:
#include <cstdio>
template <typename T>
struct Base
{
void foo ()
{
std::printf ("Base::foon");
static_cast<T *> (this)->bar ();
}
};
struct Derived : Base<Derived>
{
void bar ()
{
std::printf ("Derived::barn");
}
};
int
main ()
{
Derived d;
d.foo ();
}
这是一个非常简单的例子——你可以用访问控制、友元、编译时断言等来扩展上面的例子,但是你明白了。
您考虑过不使用继承吗?
class FooBar
{
MyObject m_object;
public:
FooBar(MyObject m): m_object(m) {}
//operate on different m_objects all you want
};
如何从一个公共基类派生六个独立的对象?然后,您可以在该基类中声明虚拟方法来创建接口,然后在派生对象类中实现它们。
也许你只需要一个模板而不是超类和6个派生类?
似乎您需要访问的不是父字段,而是子字段。您应该通过引入一个抽象方法来实现:
class ParentClass
{
public:
void f();
protected:
virtual int getSomething() = 0;
};
ParentClass::f()
{
cout << getSomething() << endl;
}
class DerivedClass : public ParentClass
{
protected:
virtual int getSomething();
}
DerivedClass::getSomething() { return 42; }
如果你需要访问父类的方法,只需使用ParentClass::method(...)
:
class ParentClass
{
public:
virtual void f();
};
class DerivedClass : public ParentClass
{
public:
virtual void f();
};
void DerivedClass::f()
{
ParentClass::f();
}
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 在设计方面:重载vector类型的类成员的插入运算符
- 如何设计一个始终是另一个类的成员的类
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 类设计:类成员继承自同一基类
- 类设计以调用另一个类的成员函数
- 从对象成员函数内部删除操作的技术 /设计模式
- 如果孩子不需要父母班级的所有受保护成员,这是不好的班级设计吗?
- 使用 std::move 转储成员的设计是否可以接受?
- C 类的设计:其他类成员中类成员的共同用途;小界面与小课
- 围绕缺乏局部成员专业化,具有特定的设计限制
- 成员变量的初始化必须延迟。此类的最佳设计选择是什么?
- 使用通用私有成员设计模板类
- 多线程设计,在C 中保护全球成员
- 设计一个具有大型成员的C++类,而这些成员很少在副本中访问
- 委派模板成员功能的良好设计
- OOP:没有静态成员或完全重新设计的类
- c++设计:从基类强制转换为派生类,没有额外的数据成员
- const引用传递的类的引用成员行为的设计原因
- std::map设计:使用std::字符串作为map键和存储的对象名称(成员)