内联在基类体内声明但通过派生类

时间:2017-03-04 20:29:16

标签: c++ inheritance inline

以下是这种情况。我在头文件中声明了一个基类,其中包含一些受保护的数据成员和一些公共getter函数(单行体)。没有虚拟方法。子类是从它派生的,并定义了自己的构造函数,其定义放在相应的cpp文件中。

是否会通过派生类的对象调用getter函数?

编辑:这是我的代码。

// quad.h
class QuadratureRule {
protected:
  int ngauss;
  Array points;
  Array weights;
public:
  QuadratureRule(int ng) : ngauss(ng) { }
  double getweights(int ig) const {
    return weights[ig];
  }
};
class Quadrature2D : public QuadratureRule {
public:
  Quadrature2D(int ng);
};

//quad.cpp
#include "quad.h"
Quadrature2D::Quadrature2D(int ng) : QuadratureRule(ng) {
  // initialize arrays in a certain way
}

我希望getweights在被类Quadrature2D的对象调用时内联。 另外,我使用的是GCC g ++ 5.4和6.3。

1 个答案:

答案 0 :(得分:0)

编辑:

我一直在检查它,似乎如果你打开优化它实际上将被内联。但正如人们在评论中已经说过的那样,这实际上取决于实施情况。例子:

Code without optimizations

Code with optimizations

你让我好奇所以我检查了一下。 这是我的计划:

//retrieve the entity
let entity =  NSEntityDescription.entity(forEntityName: "TestEntity", in: context)

let testEntity = NSManagedObject(entity: entity!, insertInto: context)

//set the entity values
testEntity.setValue(testAtt1, forKey: "testAtt1")
testEntity.setValue(testAtt2, forKey: "testAtt2")

//save the object
do {
    try context.save()
    print("saved!")
} catch let error as NSError  {
    print("Could not save \(error), \(error.userInfo)")
} catch {

}

// base.h
include <iostream>

class Base {
    int x;
    int y;
public:
    Base(int x = 0, int y = 0) : x(x), y(y) {}
    int getx() const { return x; }
    void setx(int x) { this->x = x; }
    int gety() const { return y; }
    void sety(int y) { this->y = y; }
};

在gcc 6.3上编译:

// derived.cpp
#include "base.h"

class Derived : public Base {
    int z;
public:
    Derived(int x = 0, int y = 0, int z = 0) : Base(x, y), z(z) {}
};

using namespace std;

int main() {
    Derived d(1, 2, 3);
    cout << "d.x == " << d.getx() << ", d.y == " << d.gety() << endl;
    d.setx(4);
    d.sety(4);
    cout << "d.x == " << d.getx() << ", d.y == " << d.gety() << endl;
    return 0;
}

这是objdump的一部分,在g++ -Wall -Werror -g -pedantic-errors -o derived derived.cpp 内:

main()

假设我没有忽略任何重要内容,我猜你不能相信你的代码被内联。