NULL->derivedspecific()
не компилировать
((derived*)NULL)->derivedspecific()
не определено поведение (ошибка сегментации на большинстве платформ
есть механизм, который специально разработан для поддержки такого поведения, т.е. dynamic_cast
, который идет как :
#include <typeinfo>
class base
{
public:
virtual ~base(){};
};
class derived1 : public base
{
public:
void derived1specific() const {}
};
class derived2 : public base
{
public:
void derived2specific() const {}
};
int main()
{
// use pointers
base* test = new derived1;
derived2* d2 = dynamic_cast<derived2*>(test);
if(d2)
d2->derived2specific();
derived1* d1 = dynamic_cast<derived1*>(test);
if(d1)
d1->derived1specific();
// or simply
if(derived1* d1 = dynamic_cast<derived1*>(test))
d1->derived1specific();
else if(derived2* d2 = dynamic_cast<derived2*>(test))
d2->derived2specific();
// use references
const base& testr = derived1();
try{
const derived1& d1 = dynamic_cast<const derived1&>(testr);
d1.derived1specific();
}
catch(std::bad_cast&){}
try{
const derived2& d2 = dynamic_cast<const derived2&>(testr);
d2.derived2specific();
}
catch(std::bad_cast&){}
}
Что вы хотели бы сделать, что бы я не рекомендовал вам, это примерно так:
auto doNothing = [](){return;};
(test->type()==1?(((derived1*)test)->derived1specific()):doNothing());
Вы можете попробовать весь код here.
Что касается Вашего комментария: Вы можете заменить макрос с свободной функцией (что рекомендуется в любом случае)
void derived1specific(base* b){
if(derived1* d1 = dynamic_cast<derived1*>(b))
d1->derived1specific();
}
, который делает именно то, что ваш код хочет сделать: выполнить производную определенную функцию, если и только если это уместно; вы просто называем это нравится:
derived1specific(test);
Это звучит как НЕПРАВИЛЬНОЕ решение какой-либо проблемы ... И вы должны использовать 'dynamic_cast', но в целом вы делаете что-то не так, когда используете наследование, а затем проверяете, что это за тип [если это не случай, если' if (object-> classVersion()> 1) ... 'или что-то подобное для сохранения обратной совместимости в двоичной совместимой системе]. –
'(test-> type() == 1? ((Производный *) тест): NULL) -> производный специфический();' может стать 'NULL-> производным специфическим()'. Не используйте тернарный оператор для этого. – nouney
Тогда, пожалуйста, дайте мне просто идею, как мгновенно менять ценность члена? Макро решение приемлемо для меня. Спасибо :) –