C ++使用抽象基类的具体虚方法

时间:2012-01-03 11:33:04

标签: c++ polymorphism virtual-functions

我有一个抽象的基类,混合了纯粹的和具体的虚拟方法,例如:

template < class T > class A {
   public:
   A ( ) { }
   virtual ~A ( ) { }

   virtual void purefunc( const T & a, T & b ) const = 0;
   virtual T concretefunc ( const T & a ) { 
       T b;                 // requires new memory allocation for b
       purefunc( a, b ); 
       return b; 
   }
};

实现纯虚函数的派生类,例如:

template < class T > class B : public A < T > {
   public:
   B ( T c ) : c_( c ) { }
   ~B ( ) { }

   void purefunc( const T & a, T & b ) const {
       b = c_ * a;              // uses memory of b without reallocation
   }

   private: T c_;
};

有人解释我如何在拥有子类的对象时调用具体的基本方法,而不将其类型转换为抽象基类的多态指针(如果可能的话):

int a = 2, b;
B< int > B_obj( 2 );
b = B_obj.concretefunc( a );  //!! doesn't work: 'no matching function for call'

B< int > * B_ptr = &B_obj;
b = B_ptr->concretefunc( a ); //!! doesn't work either: 'no matching function for call'

A< int > * A_ptr = &B_obj;
b = A_ptr->concretefunc( a ); //!! works, but explicit type casted isn't very intuitive

非常感谢任何解释或帮助!

编辑:添加了公共分类器, 嗯,这个虚拟代码工作正常。将检查我的实际代码中有什么不同......

编辑2:发现我的问题:我使用purefunc和concretefunc的相同名称作为彼此的重载。因此,如果你改写:

virtual void func( const T & a, T & b ) const = 0;
virtual T func ( const T & a ) { ... }

它给出了我遇到问题的编译错误。不确定为什么重载不起作用,而不同的方法是......

1 个答案:

答案 0 :(得分:1)

template < class T > class B : A < T > {
//                             ^^^^^^^

您正在使用私有继承。添加public应该修复它。

template < class T > class B : public A < T > {

(另外,您应该在A和B中添加public:,以便可以在外部访问这些方法。)