我一直在想这个问题(尽管应用程序最多是有限的)。
我有以下课程:
//a.hpp
class A
{
public:
#ifdef FOO
int foo();
#endif
};
库(静态库或共享库)定义FOO,但链接不定义可执行文件。这是有效的C++?如果foo是虚拟的,会发生什么?编译器之间是一样的吗?
c++中虚拟继承的对象布局
如何解释下面的结果?
环境是2008年的
#include <iostream>
using namespace std;
class A {
public:
virtual ~A();
virtual void foo();
};
class B : public virtual A {
public:
virtual ~B();
virtual void foo();
};
class C : public virtual A {
我已经开始学习C++了,我已经知道C和Java了。我已经开始学习它,因为我想开始使用面向对象编程。
然而,我被代码卡住了,因为编译器生成了“对Actor的vtable的未定义的引用”。在这里,你有生成相同错误的代码,而不是原始的错误,因为它不太清楚。我真的不知道是什么原因造成的。
struct Actor
{
int x, y;
virtual void move();
};
struct Player : Actor
{
Player(int a, int b)
{
x = a;
y = b;
}
我在C++虚拟继承方面遇到了问题。
我有如下的类层次结构:
class Base
{
public:
virtual void Func(){};
int BaseValue;
};
class Derived : virtual public Base
{
public:
void Func(){};
virtual void Func2(){};
int DerivedValue;
};
但是,我对内存结构有点困惑。
我希望得到sizeof(Derived)==20的结果,即:
BaseValue与衍生价值--8字节
指针表示基类(虚拟继承
下面是一个非常基本的例子:
class Base {
public:
virtual void sayHi() const {}
virtual void sayHello() {}
virtual ~Base(){}
};
class Derived : public Base {
public:
virtual void sayHi() {}
virtual void sayHello() const {}
};
int main()
{
Base *b = new Base();
Base *d = new Derived();
我之所以提出这个问题,是因为在阅读了许多帖子和答案后,我仍然没有得到我的答案。如果是这样,请将其标记为副本。 我知道在C++中,虚函数是通过虚指针和虚表来实现的。 然而,我不确定C++编译器如何破译在运行时使用哪个虚拟指针? 在下面这个简单的例子中: class Base {
public:
virtual foo() {}
}
class Derived: public Base {
public:
foo() override {}
}
int main() {
D* p_derived = new Derived();
B* p_base = p_deriv
我想了解以下涉及虚拟函数的C++程序输出背后的原因。还请解释在以下2种情况下如何生成函数指针表和包含函数指针表链接的虚拟指针表,以及如何在运行时解析调用。
/******* PROGRAM 1 *******/
#include <iostream>
using namespace std;
class Car {
public:
virtual void foo() {
cout<<"Car"<<endl;
}
};
class Bmw: public Car {
public:
我知道需要纯虚拟析构函数的情况。我也知道,如果我们不为他们提供一个实现,它将给我一个链接器错误。我不明白的是,为什么在代码片段中会出现这种情况,如下所示:
int main()
{
Base * p = new Derived;
}
这里没有删除,所以没有对析构函数的调用,也不需要它的实现(假设它应该像其他被声明但没有定义的正常函数一样运行,链接器只有在我们调用它们时才会抱怨)...or我是不是遗漏了什么?
我要明白为什么这应该是个特例?
编辑:基于BoBTFish评论的
下面是我的基本类和派生类
class Base
{
public:
Base(){}
virtua
注意:这个问题纯粹是关于asm.js的,而不是关于C++或任何其他编程语言的。
正如标题已经说过的:
如何有效地实现函数指针?
我在网上找不到任何东西,所以我想在这里问一下。
编辑:,我想在我正在做的编译器中实现虚拟函数。
在C++中,我会这样做来生成一个vtable
#include <iostream>
class Base {
public:
virtual void doSomething() = 0;
};
class Derived : public Base {
public:
void doSomething() {
st
Update:用一个直接向上的方法调用示例替换析构函数示例。
嗨,
如果我有以下代码:
class a
{
public:
virtual void func0(); // a has a VTable now
void func1();
};
class b : public a
{
public:
void func0() { a::func0(); }
void func2();
};
在B区有VTable吗?B没有虚拟函数,而是从b::func0()Does func1调用a::VTable 0()?它不是虚拟的。 func2驻留在VTable中吗?如果
我得到错误的NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. "vtable for Algorithm2A"。我假设基类中的问题--我将函数声明为纯虚拟函数,然后在派生类的头.h中重新声明它,以便能够在实现文件.cpp中实现它。
算法2.h --这是我的抽象类
#include "IAlgorithm1.h"
//! Algorithm2 interface
class IAlgorithm2 {
publ
我很确定这个问题是重复的,但我的代码在这里是不同的,以下是我的代码。它失败了,并出现了"Undefined symbols“错误,不确定缺少什么。
class Parent {
public :
virtual int func () = 0;
virtual ~Parent();
};
class Child : public Parent {
public :
int data;
Child (int k) {
data = k;
}
int func() { // virt