2013-04-19 2 views
-4
#include <iostream> 
#include <string> 

using namespace std; 

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

    virtual T OverrideMe() 
    { 
     throw string("A.OverrideMe called"); 
    } 

protected: 

    T member; 
}; 

class B : public A<double> 
{ 
public: 
    B(){}; 
    virtual ~B(){}; 

    virtual double OverrideMe() 
    { 
     throw string("B.OverrideMe called"); 
    } 
}; 

int main() 
{ 
    try 
    { 
     B b; 
    } 
    catch(string s) 
    { 
     cout << s << endl; //this prints: A.OverrideMe called 
    } 
    return 0; 
} 
+0

Что вы хотите от этого сделать? Что он делает в настоящее время? – chris

+4

Методы защищены, поэтому вы не можете называть их главным. Это не тот код, который вы используете. – juanchopanza

+2

Здесь - http://ideone.com/W2H9ZD - он печатает 'B.OverrideMe called'. Каков ваш компилятор? – borisbn

ответ

1

Вы можете переопределить метод из шаблона базового класса, как можно показать в этом примере:

#include <iostream> 
template <typename T> struct Foo 
{ 
    virtual T foo() const { 
    std::cout << "Foo::foo()\n"; 
    return T(); 
    } 
}; 

struct Bar : Foo<double> 
{ 
    virtual double foo() const { 
    std::cout << "Bar::foo()\n"; 
    return 3.14; 
    } 
}; 

int main(){ 
    Bar b; 
    double x = b.foo(); 
} 

выхода:

Bar :: foo()

0

Я подозреваю (в синем), что ваш тип T но не определено.

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