相关疑难解决方法(0)

在"类定义"中定义的C++成员函数中隐式"内联"

根据C++规范,以下两个类是否等效定义?

class A
{
   void f()
   {
   }
};

class B
{
   inline void f()
   {
   }
};
Run Code Online (Sandbox Code Playgroud)

即,将"内联"限定符放在类定义中定义的成员函数上是完全冗余的吗?

跟随问题:假设它是多余的,对于代码样式,保留"内联"标记是否明智,以便未来的开发人员意识到该函数应该内联,并且不会删除其他地方的定义并删除内联?

谢谢 :)

c++ inline class

36
推荐指数
3
解决办法
1万
查看次数

什么时候用C++创建vtable?

什么时候编译器创建一个虚函数表?

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类是否会获得动态多态性?

c++ polymorphism virtual-functions vtable

24
推荐指数
3
解决办法
2万
查看次数

C++ CRTP虚函数实例化点

我试图了解标准的简单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)

c++ templates crtp

12
推荐指数
1
解决办法
1079
查看次数

标签 统计

c++ ×3

class ×1

crtp ×1

inline ×1

polymorphism ×1

templates ×1

virtual-functions ×1

vtable ×1