2016-04-09 2 views
2

Скажем, у меня есть класс Base и производный класс вроде этого:C++ | Способ доступа к производному классу через указатель на базу?

//Base.h 
#pragma once 
class Base 
{ 
public: 
    Base(); 
    ~Base(); 
private: 
    int A; 
}; 

//Foo.h 
#pragma once 
#include "Base.h" 
class Foo : public Base 
{ 
public: 
    Foo(); 
    ~Foo(); 
    void setFoo(int number) { foo = number; }; 
private: 
    int foo; 
}; 

Скажем, я объявить указатель на базу:

Base* BasePtr = new Foo(); 

Как я могу получить доступ setFoo() используя эту Base* Baseptr; переменную? Можно ли это сделать без использования виртуальных методов? Кажется противоречащим интуиции иметь виртуальный метод в базе только для того, чтобы использовать собственные методы Foo.

Причина, по которой я спрашиваю, имеет назначение, для которого требуется массив указателей на базу, а также способ редактировать собственные атрибуты производных классов.

Благодаря

+0

У вас есть проблема, если вам нужно знать, что производный тип. Вы должны закодировать интерфейс, который реализует ваши классы, и использовать указатели интерфейса. Наследование интерфейса очень полезно. – dgsomerton

ответ

-1

Как об этом:

Foo * p = new Foo(); 
p->setFoo(10); 
Base * BasePtr = p; 

В качестве альтернативы:

Base * BasePtr = new Foo(); 
static_cast<Foo *>(BasePtr)->setFoo(10); 
+0

В первом случае я предполагаю, что это нужно сделать перед объявлением массива Pointer-to-base, альтернативно нужно копировать весь объект каждый раз, когда я хочу получить доступ к методам производных классов. Что касается других методов, если это работает, отлично, но есть ли для этого недостатки? –

+0

Разве это не reinterpret_cast даже быстрее, чем static_cast? –

+0

@ Peregring-lk: Нет, и это даже не правильно. –

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