2012-05-01 6 views
-4

Как бы идти о выполнении следующих действий в C++ (следующий код C#):Как создать абстрактный базовый класс в C++?

class Base 
{ 
    public virtual void Foo() 
    { 
     // do stuff... 
    } 
} 

class C : Base 
{ 
    public override void Foo() 
    { 
     base.Foo(); // <=== how do you do this line? 
    } 
} 
+3

[Переполнение стека не является сервисом перевода кода] (http://meta.stackexchange.com/a/129362). Объясните требования на простом английском языке, а не в коде на другом языке программирования. – dtb

+0

Попробуйте 'Base :: Foo();' в производном классе 'Foo' –

+2

Этот код не компилируется в C#« Невозможно вызвать абстрактный базовый элемент ». – DaveShaw

ответ

5

Используйте оператор :::

class Base 
{ 
public: 
    virtual ~Base() {} 
    virtual void Foo() 
    { 
     // do stuff 
    } 
}; 

class C : public Base 
{ 
public: 
    void Foo() 
    { 
     Base::Foo(); 
    } 
}; 

Чтобы иметь абстрактный класс в C++, по крайней мере один потребности метод быть чисто виртуальным:

class Base 
{ 
public: 
    virtual ~Base() {} 
    virtual void Foo() {} 
    virtual void another_function() = 0; // Pure virtual function. 
}; 
+0

'Base :: Foo' должен быть абстрактным, поэтому OP не может« делать что-то »там. Сделайте его чистой виртуальной функцией. Конечно, последствием этого было бы то, что 'Base :: Foo()' больше не имеет смысла. –

+1

@Branko Чистая виртуальная функция также может иметь реализацию. – jrok

+0

Отлично, оператор :: был именно тем, что я искал! Благодаря! – rhughes

2

Как это:

class base { 
public: 
    virtual void Foo() = 0; 
} 

class sub : public base { 
public: 
    void Foo() { 
     std::cout << "In Sub!" << std::endl; 
    } 
} 

Обратите внимание на использование ключевого слова virtual. В C++, если явно не объявлено, реализация функций не просматривается во время выполнения, например C#, Objective-C или Java. Таким образом, мы должны указать время выполнения:

«Привет, у нас есть функция, которая должна быть реализована во время выполнения, поэтому не предполагайте, что она относится к классу base, но относится к подклассу».

Также обратите внимание на часть декларации функции = 0. В C++ это описывает функцию pure virtual. Без него base не может быть абстрактным, если не существует другой функции, которая называется pure virtual в классе.

+0

Мой комментарий к q был для OP. Извините за путаницу –

+0

В C# – Fanael

+0

@Fanael не так же, как на C++. Я могу переопределить метод на C#, отнести подкласс к базовому классу и когда я вызываю метод на базе class, он будет вызывать реализацию подкласса. Это невозможно в C++ –

0

Чтобы сделать реферат класса на C++, вам необходимо предоставить ему чистую виртуальную функцию. Версия C++ вашего кода будет:

class Base 
{ 
public: 
    virtual void Foo() = 0; //setting a virtual function to 0 makes it pure virtual.  This is abstract. 
} 

class C : Base 
{ 
public: 
    void Foo() 
    { 
     Base::Foo(); //I don't think this line will work...You're calling an abstract method. 
    } 
} 
1

Я просто хотел бы отметить, что вы можете сделать это в C++. Вы просто реализовать чистую виртуальную функцию в C++, который вы можете сделать это в вашем .h:

class Base 
{ 
    public: 
     Base(); 
     virtual ~Base(); 
     virtual void Foo()=0; 
}; 

и это в .cpp

void Base::Foo() 
{ 
    std::cout<< "In Base::Foo which is pure virtual\n"; 
} 

Тогда в производном классе делать то, что другие и в вашем Derived :: Foo() вы можете вызвать Base :: Foo(), который будет выдавать результат. Создание функции pure virtual не исключает возможности иметь исполняемый код.

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