c ++, в дочернем классе , как получить доступ к методу родительского класса без объекта? - PullRequest
0 голосов
/ 30 октября 2018

Я думаю, что только статический метод может сделать следующее, но он может работать. Кто-нибудь может сказать мне, как это работает? какой принцип стоит за этой вещью.

#include <iostream>
using namespace std;

class Parent {
protected:
    unsigned char* buf;
    unsigned int bufLenght;

public:
     void Setup()
    {
        buf = nullptr;
        bufLenght = 0;
        cout << "in Parent class Setup()" << endl;
    }
    virtual void TearDown() 
    {
        delete[] buf;
    }
};

class Child : public Parent{
public:
    virtual void Setup()
    {
        Parent::Setup();    // access Parent method without a parent's object?
        cout << "in Child class Setup()" << endl;
    }
};

int main(int argc, char const *argv[])
{
    Child co;
    co.Setup();

    return 0;
}

запустите этот код, результат:

в настройках родительского класса ()

в настройках дочернего класса ()

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Каждый объект Child построен поверх объекта Parent. Всякий раз, когда у вас есть Child, у вас также есть Parent.

0 голосов
/ 30 октября 2018

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

Хотя ваш вопрос довольно неясен, вот моя лучшая попытка продемонстрировать, как реализовать полиморфизм в C ++:

class A {
protected:
    // You will not be able to access this in the
    // other class unless you explicitly declare it as
    // a 'friend' class.
    int m_ProtectedVariable;

public:
    // Let's define a virtual function that we can
    // override in another class.
    virtual void ClassMethod( ) {
        printf( "[A::ClassMethod] Called!\n" );
    }
}

class B : public A {
public:
    // There is no need for the virtual/override keywords
    // if you are overloading the function which is already defined
    // in another class as 'virtual'. I prefer to keep them for
    // pedantic reasons.
    /* virtual */ void ClassMethod( ) /* override */ {
        // 
        printf( "[B::ClassMethod] Called!\n" );

        // Since the function is a virtual, we can always
        // call the base class function.
        A::ClassMethod( /* ... */ );
    }
}

Надеюсь, вы найдете это полезным во всем, что вы пытаетесь достичь: -)

РЕДАКТИРОВАТЬ: В вашем конкретном сценарии, где вы должны выделить буфер, когда вам это нужно, и уничтожить его впоследствии - почему вы не используете функциональность конструктора / деструктора класса? Было бы гораздо более интуитивно понятно, когда компилятор решает, когда управлять памятью (в данном случае), поскольку это произойдет автоматически, как только ваш объект выйдет из области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...