根据C++规范,以下两个类是否等效定义?
class A
{
void f()
{
}
};
class B
{
inline void f()
{
}
};
Run Code Online (Sandbox Code Playgroud)
即,将"内联"限定符放在类定义中定义的成员函数上是完全冗余的吗?
跟随问题:假设它是多余的,对于代码样式,保留"内联"标记是否明智,以便未来的开发人员意识到该函数应该内联,并且不会删除其他地方的定义并删除内联?
谢谢 :)
什么时候编译器创建一个虚函数表?
1)当类包含至少一个虚函数时.
要么
2)当直接基类包含至少一个虚函数时.
要么
3)当层次结构的任何级别的任何父类包含至少一个虚函数时.
与此相关的问题:是否可以放弃C++层次结构中的动态调度?
例如,考虑以下示例.
#include <iostream>
using namespace std;
class A {
public:
virtual void f();
};
class B: public A {
public:
void f();
};
class C: public B {
public:
void f();
};
Run Code Online (Sandbox Code Playgroud)
哪些类将包含V表?
既然B没有将f()声明为虚拟,那么C类是否会获得动态多态性?
我试图了解标准的简单CRTP模式是否有效.
下面的代码编译并按预期工作(在clang上).
但是我对相关标准章节/段落的理解是,虚函数CRTP <Derived,Base> :: DoSomething()的实例化应该在代码的点(B)处,其中Derived的完整声明不是可用.因此内部typedef类型也不应该可用.
任何人都可以指出验证此代码的相关标准章节吗?
换句话说,在这种情况下,虚拟函数被实例化ATFER点C?非常感谢您的任何见解.
弗朗切斯科
//-------------------------
// START CODE
#include <iostream>
struct Type1 {};
struct Type2 {};
struct Base
{
virtual ~Base() {}
virtual void DoSomething() = 0;
};
template< typename T, typename U >
struct CRTP : U
{
virtual void DoSomething() { DoSomething( typename T::Type() ); }
void DoSomething( Type1 ) { std::cout << "1\n"; }
void DoSomething( Type2 ) { std::cout << "2\n"; }
};
// (A) point of inst. of CRTP< Derived, …
Run Code Online (Sandbox Code Playgroud)