【发布时间】:2021-09-10 21:54:56
【问题描述】:
有没有一种方法可以从基类对象调用派生类的方法,而基类对象不提供调用接口?我想做这样的事情
template<typename T>
struct A
{
using Derived = T;
void print()
{
static_cast<T*>(this)->print_();
}
void print_()
{
std::cout << "Base" << std::endl;
}
void a()
{
std::cout << "Aa" << std::endl;
}
};
struct B : public A<B>
{
void print_()
{
std::cout << "BD" << std::endl;
}
void b()
{
std::cout << "Bb" << std::endl;
}
};
struct C : public A<C>{
void c()
{
std::cout << "Cc" << std::endl;
}
};
int main()
{
A<B> b;
A<C> c;
b.print();
c.print();
B bd;
b.a();
bd.b(); // This works
// b.b(); // I understand this doesn't work, but I want to make this work.
C bc;
c.a();
bc.c(); // Same as class A<C> and C
}
我可以提供接口来调用这些函数,但我想知道这是否可以实现。非常感谢任何有关可行性的解决方案或 cmet。
PS:我只是对此感到好奇,因为我在错误地实例化类时遇到了意外错误。
【问题讨论】:
-
template<typename T> struct A : T {/*..*/};代替?但你不能再做B{}.a()。 -
您需要使用这样的方法解决的原始和潜在问题(如果有)是什么?如果只是单纯的好奇,那没关系,只要你说出来。但是,如果您有一个应该解决的实际问题,那么请直接询问该问题,并提供您如何解决该问题的尝试。
-
T* A<T>::operator ->()可能是一个选项。 -
你已经在
b.print();有未定义的行为,因为b是A<B>(b中不包含B)。当您转换为B*并调用非静态成员函数B::print_时,您将在不存在的对象上调用它。所以问题是,当没有B实例时,您希望b.print()和b.b()在什么实例上运行? -
@Someprogrammerdude 这只是好奇。感谢您的评论,将更新问题。 :)