以下是这种情况。我在头文件中声明了一个基类,其中包含一些受保护的数据成员和一些公共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。
答案 0 :(得分:0)
编辑:
我一直在检查它,似乎如果你打开优化它实际上将被内联。但正如人们在评论中已经说过的那样,这实际上取决于实施情况。例子:
你让我好奇所以我检查了一下。 这是我的计划:
//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()
假设我没有忽略任何重要内容,我猜你不能相信你的代码被内联。