2015-11-21 4 views
-6

Вот мой код. Я не понимаю, почему я не достигаю b->x;Указатель базового класса не видит членов Derived

main.cpp

#include <iostream> 
#include "Nesne.h" 
using namespace std; 

int main() 
{ 
    Derived obj; 
    Base *b=&obj; 

    b->a=2; 
    b->x=3; 


    return 0; 
} 

Nesne.h

#ifndef NESNE_H 
#define NESNE_H 


class Base 
{ 
    public: 
    int a; 

    Base(); 
    virtual ~Base(); 
protected: 
private: 
}; 

class Derived : public Base 
{ 
public: 
int x; 
    Derived(){}; 
}; 

#endif // NESNE_H 
+0

добавить изображение, вы можете легко найти – cezaalp

+3

Не публикуйте * скриншоты текста *. Stack Overflow позволяет вам вводить текст в вопрос. –

+0

Зачем вам это нужно? Нет 'Base :: x'. – LogicStuff

ответ

2

Наследование идет в другом направлении.

Указатель на производный объект может видеть базовые элементы, но указатель на базу не может видеть производные элементы. Для членов данных нет virtual, и даже для функций он будет виртуальным, только если объявлено так в Base. (виртуальный позволяет вам получить доступ к производной версии функции через базовый указатель или ссылку).

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

static_cast<Derived*>(b)->x = 3; 
+0

Вы имеете в виду reinterpret_cast <>? static_cast <> также будет работать здесь, но reinterpret_cast <> очень хочет, чтобы желаемый листинг находился в цепочке наследования. Если не литой, становится nullptr. static_cast <> не выполняет эту проверку и всегда будет возвращать указатель, действительный или недействительный, –

+0

@Viktor Lier Нет. Я, конечно же, не имел в виду 'reinterpret_cast', и вы тоже не должны. 'reinterpret_cast' будет серьезно ошибочным. Вы имели в виду 'dynamic_cast', и я до сих пор не согласен. Выбор между 'static_cast' и' dynamic_cast' может быть решением суда. Но ваше общее отклонение 'static_cast' не является хорошей разработкой программного обеспечения. – JSF

+0

Собственно, ı будет использовать вектор, как вектор vec; Но я не понимаю здесь – cezaalp

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