2016-12-17 1 views
0

Скажем у вас есть класс Болл и в Ball.h у вас естьКак разрешение идентификаторов членов класса работает в C++

class Ball { 
public: 
    int foo(); 
}; 

с его файл Ball.cc с функцией

int Ball::foo(){ 
    return 5; 
} 

и тогда у вас есть класс BigBall с

#include <Ball.h> 

class BigBall : public Ball { 
public: 

}; 

, а затем в главном вы делаете BigBall

auto bigRed = make_shared<BigBall>(): 

Как вы могли бы использовать foo(); на объекте bigRed?

Somthing как

Ball::bigRed->foo(); 

но я получаю сказал, что мяч не может решить ....

+0

Вы используете 'auto',' make_shared', но вы не знаете, что такое наследование? Я бы посоветовал вам начать с книги начинающих, чтобы изучить основы. – Klaus

ответ

1

Почти. Вам нужно сделать разрешение на идентификатору функции, а не объект:

bigRed->Ball::foo(); 

Но если BigBall перегрузкам и скрывает оригинальный Ball::foo, вы на самом деле не нужно, чтобы решить что-нибудь:

bigRed->foo(); 
+0

hahaha я был так близко спасибо !! :) – sam

+0

hmm im все еще получает ошибку tho, что ее неправильное использование Ball :: Ball и этого метода foo не может быть разрешено. – sam

+0

@sam. Вы не правильно связываете свою программу. – StoryTeller

1

С std::shared_ptr вы можете использовать оператор -> так:

auto foo = bigRed->foo(); 

Наслаждайтесь!

+0

Спасибо !!!!!! – sam

1

Все, что вам нужно это:

BigBall ball; 
ball.foo(); 

Это создает объект с именем ball типа BigBall и вызывает foo(). Вам не нужно делать ничего особенного, чтобы вызвать функцию, определенную в базовом классе. Просто позвоните.

Это auto и make_shared вещи всего лишь отвлечение.