2016-06-24 4 views
1

Мы не можем создать объект абстрактного класса, не так ли? Итак, как я могу назвать виртуальную функцию, которая имеет определение как в абстрактном базовом классе, так и в производном классе? Я хочу выполнить код в абстрактном базовом классе, но в настоящее время я использую объект производного класса.Как я могу назвать определение виртуальной функции базового класса, имеющего определения как в абстрактном базовом классе, так и в производном классе в C++?

class T 
{ 
    public: 
    virtual int f1()=0; 
    virtual int f2() { a = 5; return a } 
} 
class DT : public T 
{ 
    public: 
    int f1() { return 10; } 
    int f2() { return 4; } 
} 

int main() 
{ 
    T *t; 
    t = new DT(); 
    ............ 
} 

Можно ли каким-либо образом вызвать функцию базового класса с помощью объекта t? Если это невозможно, что мне нужно сделать, чтобы вызвать функцию базового класса?

+1

Как создать Minimal, полный и проверяемый пример http://stackoverflow.com/ help/mcve –

+0

@RichardCritten Полезно в целом, но, если быть справедливым, описание кода OP достаточно хорошо для понимания как есть. – Angew

ответ

4

Так же, как вы могли бы назвать любую другую реализацию базового класса: использовать явную квалификацию для обхода динамического механизма доставки.

struct AbstractBase 
{ 
    virtual void abstract() = 0; 

    virtual bool concrete() { return false; } 
}; 

struct Derived : AbstractBase 
{ 
    void abstract() override {} 

    bool concrete() override { return true; } 
}; 

int main() 
{ 
    // Use through object: 
    Derived d; 
    bool b = d.AbstractBase::concrete(); 
    assert(!b); 

    // Use through pointer: 
    AbstractBase *a = new Derived(); 
    b = a->AbstractBase::concrete(); 
    assert(!b); 
} 
+0

Проверьте код. – aaroh

+2

@aaroh Это даже не компилируется. Возможно, это должно было быть «T * t»? Если да, просто сделайте 't-> T :: f2()'; и отредактируйте свой вопрос, чтобы иметь правильный код. – Angew

1

Вы можете указать область класса явно при вызове функции:

class A { /* Abstract class */ }; 
    class B : public A {} 

    B b; 
    b.A::foo(); 
1

Если абстрактный базовый класс имеет некоторый код, то просто позвоните BaseClassName :: AbstractFunction()

class Base 
{ 
    virtual void Function() {} 
} 

class Derived : Base 
{ 
    virtual void Function() { Base::Function(); } 
}