2011-01-10 2 views
2

Может ли статическая функция-член базового класса вызвать свой производный объект класса?Может ли статическая функция-член базового класса вызвать свой производный объект класса? (C++)

+0

что имеется в виду, называя производный объект класса? вы имеете в виду виртуальную функцию? – Naveen

+0

Как статическая функция-член получает ссылку на производный объект? Также является ли вызов метода общедоступным или закрытым? И это виртуально? Можете ли вы поделиться каким-то кодом – Neera

+0

Не могли бы вы рассказать нам, что вы имеете в виду здесь, - вызвать другую статическую функцию в производном объекте? Обратиться к полиморфной функции в производном объекте? – Elemental

ответ

3

Подумайте, static Функция-член как некоторая функция, не являющаяся членом. Так да. Независимо от функции, не входящей в число, функция static может выполнять ту же самую вещь!

1

Да, хотя есть две вещи, на которые следует обратить внимание.

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

<Base.h> 
class Base 
{ 
protected: 
    Base(); 
public: 
    virtual ~Base(); 

    static Base* Create(); 
}; 

<Derived.h> 
#include "Base.h" 
class Derived : public Base 
{ 
public: 
    Derived(int aParameterGoesHere); 
}; 

<Base.cpp> 
#include "Base.h" 
#include "Derived.h" 

Base::Base() { } 
Base::~Base() { } 

Base* Base::Create() 
{ 
    return new Derived(42); 
} 

Вторая вещь, чтобы наблюдать за то, что частные/защищенные члены Derived не доступны из Base, если они не были признаны в качестве виртуальных членов Base или Base объявлен друг класс Derived (который не является необоснованным, учитывая тесную связь):

<Derived.h> 
#include "Base.h" 
class Derived : public Base 
{ 
    friend Base; 
private: 
    Derived(int aParameterGoesHere); 
}; 
1

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

Однако, это возможно, если вы используете CRTP, как это:

template<T> 
struct base 
{ 
    base() 
    { 
    T::foo(); // here calling a static method of derived class 
    } 
    virtual ~base(){} 
}; 

struct A : base<A> 
{ 
    virtual ~A(){} 
    static void foo() 
    { 
    // do stuff 
    } 
}; 
+0

VJo: почему бы не использовать функцию 'virtual' вместо этого? – Nawaz

+0

@Nawaz Я не понимаю ваш вопрос. В статическом методе вы не можете получить доступ к этому. Если вы хотите использовать virtual вместо static для foo(), вы должны вызвать foo в базовом классе, а не в производном. –

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