我有一个抽象的基类,混合了纯粹的和具体的虚拟方法,例如:
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 ) { ... }
它给出了我遇到问题的编译错误。不确定为什么重载不起作用,而不同的方法是......
答案 0 :(得分:1)
template < class T > class B : A < T > {
// ^^^^^^^
您正在使用私有继承。添加public
应该修复它。
template < class T > class B : public A < T > {
(另外,您应该在A和B中添加public:
,以便可以在外部访问这些方法。)