我有这个代码:
#include <iostream>
using namespace std;
struct A;
struct B;
void g(A* a){ cout << "A";}
void g(B* b){ cout << "B";}
struct A{
A(){ g(this); }
};
struct B : A{
B(){}
};
int main() {
B* b=new B();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其中输出是:
一个
这是否意味着this传递给构造函数的指针A()类型是A*什么类型?
这可能是一个简单的问题,但我有这个template class:
template<typename Type>
class Array {
size_t n;
Type* buff;
public:
Array(size_t n_): n(n_), buff(new Type[n]) {}
};
Run Code Online (Sandbox Code Playgroud)
该代码来自课程pdf文件,其中说它buff(new Type[n])不安全.我不明白为什么它不安全,是不是size_t一般都没有签名?我可以举例说明它可能有编译和/或运行时错误吗?
关于这篇文章:
对于使用vtable的实现,答案是:通常是.您可能认为抽象类不需要vtable,因为派生类将具有自己的vtable,但在 构造 期间需要它:在构造基类时,它将vtable指针设置为其自己的vtable.稍后当输入派生类 构造函数时,它将使用自己的vtable代替.
我假设答案是正确的,但我不太明白.为什么vtable需要完全用于施工?
我有2个文件:
AC
和
公元前
它们都没有主要功能.如何编译并将它们链接到一个名为Do的单个非可执行文件中?
假设我有这段代码:
class Vehicle {
virtual const char* media() const = 0;
virtual unsigned speed() const = 0;
} V, *PV;
class LandVehicle : public Vehicle {
const char* media() const override{ return "Land";}
} L, *PL;
class Train : public LandVehicle{
virtual unsigned speed() const override {return 130;}
} T, *PT;
Run Code Online (Sandbox Code Playgroud)
我有几个问题:D
1)LandVehicle没有实现速度().这是一个错误,如果是这样,会出现什么样的错误?或者它只是使它成为一个抽象类?
2)是正确使用方法media()中的类LandVehicle中的关键字覆盖?作为抽象类的派生类,它真的覆盖了方法吗?
3)与Train的speed()方法中的覆盖相同.
4)现在培养一个具体课程?
5)是否有必要在LandVehicle的media()方法的声明中添加关键字virtual?
6)如果我在Train类中添加此方法:
const char* media() const{ return "Just a train";}
Run Code Online (Sandbox Code Playgroud)
它隐藏了LandVehicle的媒体()还是覆盖它?
7)在6中添加方法后,可以在Train类中访问LandVehicle的media()吗?
c++ ×4
c ×1
compilation ×1
constructor ×1
gcc ×1
inheritance ×1
linker ×1
oop ×1
pure-virtual ×1
vtable ×1