【发布时间】:2010-11-19 00:45:03
【问题描述】:
如果你有这样的事情:
#include <iostream>
template<typename T> class A
{
public:
void func()
{
T::func();
}
};
class B : public A<B>
{
public:
virtual void func()
{
std::cout << "into func";
}
};
class C : public B
{
};
int main()
{
C c;
c.func();
return 0;
}
func() 是动态调度的吗?
你怎么能实现类 A,如果 B 有一个虚拟覆盖,它是动态调度的,但如果 B 没有,它是静态调度的?
编辑:我的代码没有编译?对不起大家。我现在有点病了。我的新代码也无法编译,但这是问题的一部分。另外,这个问题是给我的,而不是常见问题。
#include <iostream>
template<typename T> class A
{
public:
void func()
{
T::func();
}
};
class B : public A<B>
{
public:
virtual void func()
{
std::cout << "in B::func()\n";
}
};
class C : public B
{
public:
virtual void func() {
std::cout << "in C::func()\n";
}
};
class D : public A<D> {
void func() {
std::cout << "in D::func()\n";
}
};
class E : public D {
void func() {
std::cout << "in E::func()\n";
}
};
int main()
{
C c;
c.func();
A<B>& ref = c;
ref.func(); // Invokes dynamic lookup, as B declared itself virtual
A<D>* ptr = new E;
ptr->func(); // Calls D::func statically as D did not declare itself virtual
std::cin.get();
return 0;
}
visual studio 2010\projects\temp\temp\main.cpp(8): error C2352: 'B::func' : illegal call of non-static member function
visual studio 2010\projects\temp\temp\main.cpp(15) : see declaration of 'B::func'
visual studio 2010\projects\temp\temp\main.cpp(7) : while compiling class template member function 'void A<T>::func(void)'
with
[
T=B
]
visual studio 2010\projects\temp\temp\main.cpp(13) : see reference to class template instantiation 'A<T>' being compiled
with
[
T=B
]
【问题讨论】:
-
添加到常见问题解答中,似乎很有用。
-
也许通过说明您打算做什么会给您一个更好的解决方案,并且说“更好”我主要是指可维护,您可以阅读和理解您自己的稍后再编码。
-
@the_drow:这个问题需要很多帮助才能成为常见问题解答候选者。代码示例需要更改才能编译,然后发布者需要解释实际行为与期望行为有何不同,然后才能回答,如果看起来足够通用,则进行常见问题解答。
-
@Ben Voigt:似乎这个问题对于那些想要了解 v-talbe 以及 c++ 它是如何在幕后具有魔力的人来说非常有用。可以做些什么来改进此消息?
-
@the_drow:这个问题与虚函数实现的内部无关。我认为这与模板专业化、编译时重载解析和通过虚函数的动态调度之间的交互有关,但很难回答有关无法编译的代码行为的问题。
标签: c++ oop inheritance