2015-02-17 2 views
0
#include<iostream> 

using namespace std; 

class C 
{ 
public: 
C(){}; 
virtual void nothing()=0; 
virtual ~C(){}; 
}; 

class A : public C 
{ 
public: 
A(){}; 
virtual void nothing(){}; 
}; 
class B:public A 
{ 
public: 
B(){}; 
void nothing(){}; 
}; 

template <class T> 
void hi(T){ 
cout << " i am something\n"; 
} 

template <> 
void hi<A>(A) 
{ 
cout << " I am A\n"; 
} 

template <> 
void hi<B>(B) 
{ 
cout << " I am B\n"; 
} 

int main () 
{ 
C *array [] = {new A,new B}; 
hi (*array [0]); 
hi (*array [1]); 

delete array [0]; 
delete array [1]; 
return 0; 

} 

Out: я что-то я что-тоНаследование с шаблонами

В настоящее время я пишу программу, которая имеет дело с
Наследование типов и специализированных шаблонов. В приведенном выше примере мне хотелось бы посмотреть I am A I am B Есть ли способ правильно вызвать функции, соответствующие объектам, хотя я обрабатываю массив базового класса? Я не уверен, что проверка типов и преобразование через dynamic_cast - самое изящное решение. Обратите внимание, что это всего лишь выдержка из более крупной программы. Заранее спасибо

+1

Вы пытаетесь использовать свои объекты полиморфно, но создание экземпляра экземпляра происходит во время компиляции. Вам нужна проверка типа времени выполнения, как и предполагалось. –

ответ

1

В основной рутине три строки, показанные ниже, создают массив C*. Таким образом, любой элемент этого массива рассматривается как C* независимо от того, каков фактический тип элемента. То есть, когда вы передаете *array [0] функции hi(), , функция, которая вызывается, равна hi(C), которая разрешает функцию hi, а не одну из специализированных функций.

C *array [] = {new A,new B}; 
hi (*array [0]); 
hi (*array [1]); 

Чтобы hi<A> быть вызван, вы должны либо хранить указатель на новый объект в переменной типа A* или вам нужно бросить C* к A*.

В случае, подобном этому, виртуальная функция C, переопределен в A и B, может служить цели лучше.

Смежные вопросы