2015-07-10 3 views
0

Отказ от ответственности: Я долго программист на C++, поэтому очень вероятно/возможно, что есть лучший способ сделать это.Функция переопределения в объекте-объекте

Я хотел бы создать class A с 1 по N членов class B. В большинстве случаев я нормально звоню в функции участника class B. Однако в некоторых случаях я хотел бы переопределить функцию-член вclass B. Есть ли элегантный способ сделать это без необходимости создавать производный класс от class B каждый раз?

Вот пример:

using namespace std; 
#include <iostream> 

class B 
{ 
public: 
    void print(); 
}; 

void B::print() 
{ 
    cout << "B::print" << endl; 
} 

class A 
{ 
public: 
    B b; 
    B bprime; 
}; 

int main() 
{ 
    A a; 
    a.b.print(); 
    a.bprime.print(); 
    return 0; 
} 

Есть ли способ, чтобы переопределить функцию print() в bprime или иным образом изменить его? В C я бы оставил class B в качестве структурных и используемых указателей функций, но я хотел бы избежать этого.

+1

Вывод из базового класса * есть * элегантный способ. – Bathsheba

+0

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

+0

(1) Как вы хотите решить, когда назвать «премьер» печать? В зависимости от того, какой экземпляр, как в вашем примере? -> Наследование - путь. По другому условию? дайте нам знать. (2) есть ли у вас вектор/контейнер? в этом случае -> умные указатели, виртуальные функции. ** tl; dr ** нам нужно больше деталей. – peterchen

ответ

0

Вы можете использовать функцию std :: для имитации полиморфизма.

class B 
{ 
    public: 
    std::function<_FUNCTION_SIGNATURE_HERE_> print; 
}; 

, то вы всегда можете переопределить элемент печати в экземпляре B

a.bprime.print = SomeOTherFunctionWithSameSignature; 

и с этого момента bprime будет вести себя так, как будто это был другой подкласс в иерархии. Все будет работать одинаково, кроме этой конкретной функции, которую вы изменили.

Конечно, вам нужно будет установить начальное поведение члена печати в вашем конструкторе.

+0

Как объявляется 'SomeOherFunctionWithSameSignature'? Является ли он членом класса A или является его статической функцией? – GrandAdmiral

+0

Это может быть почти что угодно. бесплатная функция, функция-член ... std :: function скрывает все зависимости. это действительно замечательная функция нового C++. Если это бесплатная функция, вы можете просто назначить ее объекту функции печати, и все будет работать. если это член класса, вам придется привязать к нему фактический объект std :: bind и назначить результат привязки. Просто прочитайте std :: function docs – Zeks

+0

Вау, это было бы здорово. Мне бы очень хотелось, чтобы у меня была функция a.bprime.print = class A. Это можно было бы назвать A.b.print() для поведения по умолчанию, но A.bprime.print() действительно может быть вызовом A.specialPrint(), если это необходимо. – GrandAdmiral

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