指出:
。。如果动态类型的E1不包含E2引用的成员,则行为未定义.
下面的代码是UB吗?
struct B { int a{ 10 }; };
struct D : B { int a{ 15 }; };
B b;
b.*static_cast<int B::*>(&D::a); // Does [expr.mptr.oper]/4 applies?
从成员访问表达式返回的值只是随机的。为什么?
如果我将上面的代码替换为下面的代码,我将得到B::a 10的值
struct B { int a{ 10 }; };
struct D : B { int a{ 1
设A是基类,B是它的公共派生类。
B b;
切片:
A a = b;
上播:
A* p = &b; // p is a pointer variable of type A
A& r = b; // r is a reference variable of type A
这是正确的吗?如果可能的话,请分享类似的例子来说明这两个概念。
在将继承的类类型作为参数传递给采用基类类型的方法时,我遇到了问题。
class Base {...}
class Derived : public Base {...}
class Container {
vector<Base*> cont; //1
public:
void addToCont(Base x) { //2
cont.push_back(&x);
}
}
int main() {
Container c;
c.addToCont(Derived(p1,p2)); //3
}
1)我想我需要有指向对象的
请查看以下代码清单:
#include <iostream>
using namespace std;
class Base {
public:
virtual void Message() = 0;
};
class Intermediate : public Base {
};
class Final : public Intermediate {
void Message() {
cout << "Hello World!" << endl;
}
};
int main() {
在了解了切片之后,据我所见,它可以使用指向动态变量的指针被打破。但是为什么呢?为什么在那一点上没有切片?我想我自己,但我不确定。在ppet = pdog;分配之后,pdog指向ppet的相同地址。不是吗?
//Program to illustrate use of a virtual function
//to defeat the slicing problem.
#include <string>
#include <iostream>
using namespace std;
class Pet
{
public:
virtual void pri
我对纯C中虚拟函数的实现感兴趣,这里是一个。然后通过指向基类的虚拟函数表的指针实现派生类。为什么派生类没有vtable指针,而使用基类的vtable。也许是因为它们是相同的抵消?
void myClassDerived_ctor(struct myClassDerived *this)
{
myClassBase_ctor(&this->base);
this->base.vtable = (void*)&myClassDerived_vtable + sizeof(void*); // used vtable of the base class
}
有没有捷径可以把一个基类转换成它在程序中的派生类?例如:
假设我有三个类,一个基类和两个派生类:
class cColor {
};
class cBlue : public cColor {
};
class cRed : public cColor {
};
然后我在程序中创建了一个Color类:
int main(){
cColor unsaturated
return 0;
}
有什么方法可以将unsaturated从cColor类转换为cBlue或cRed类吗?类似的解决方案是将unsaturated存储在指针中,从指针创建一个新的cBlue或cRed类,然后删除unsatura
我正在努力学习C++,并编写了这段代码。根据我的理解,这段代码需要以"Derived Class"的形式生成输出,但是输出是"Base Class"。请帮我理解一下。
#include <iostream>
using namespace std;
class Base {
public:
char* name;
void display() {
cout << name << endl;
}
};
class Derived: public Base {
我对C++比较陌生。我们有一个抽象基类和两个派生类。
class PositionBase (abstract)
class PositionLenght: PositionBase
class PositionAngle: PositionBase
PositionBase包含获取名称等功能。派生类具有像GetLenght()或GetAngle();这样的方法
(旧的)应用程序包含一个包含派生类的数组。
假设我从array[1]获取对象,并根据它的类型,我想运行GetLength() or GetAngle()。然后我需要知道我从数组中得到的对象类型。
当我使用:
if(Positio
假设我们有这个密码
class A {
public:
A() : x(1) {}
virtual ~A() {}
int x;
};
class B {
public:
B() : y(2) {}
virtual ~B() {}
void g()
{
cout << "B::" << y << endl;
}
int y;
};
class C : private A, private B {
public:
void f()
我试图充分理解如何在C++中确定类大小,以便在设计数据结构时记住这一点。我有一些类是我为测试而创建的,但在某些大小上似乎有些困难,可能是因为不知道将这些大小相加在一起的顺序。
考虑一下64位编译的下列内容
class A {
public:
virtual void work() {}
private:
float a;
float b;
};
class B : A {
private:
float b1;
};
class C : A {
private:
float c1;
};
class D : C {
private:
fl
如何从基类调用派生函数?我的意思是,能够从基类到派生类替换一个函数。
例如。
class a
{
public:
void f1();
void f2();
};
void a::f1()
{
this->f2();
}
/* here goes the a::f2() definition, etc */
class b : public a
{
public:
void f2();
};
/* here goes the b::f2() definition, etc */
void lala(int s)
{
a *o; // I wa
在下面的示例中: class A
{
public:
A();
virtual ~A();
int getID() const;
private:
int m_ID;
};
Class B : public A
{
public:
B();
virtual ~B();
int getBid() const;
private:
int m_Bid;
};
bool test(const A* const p_A)
{
if(5U == static_cast<const B* const>(p_A)-&
我不明白我做错了什么。我收到错误消息:上面这行代码从A*到B*的转换无效:
B *p3=new A(p2->operator+(*p1));
下面是完整的代码。
#include <iostream>
using namespace std;
#include <iostream>
using namespace std;
class A
{
protected: int x;
public: A(int i=-31) {x=i;}
virtual A operator+(A a) {return x+a.x;}
};
class B:p
假设我有一个带虚函数的空类:
class Base
{
public:
virtual void Foo(){std::cout << "this is the base class";}
}
然后,我有一个从Base继承并重写Foo()的类。
class Derived : public Base
{
public:
void Foo(){std::cout << "this is the derived class";}
}
然后还有一些包含Base列表的其他类
class OtherClass
{
public:
编译f有效,但编译g失败时出错。
这一切为什么要发生?
class A {
public:
A() {}
};
class B : public A {
public:
B() {}
};
void f() {
A* a = new A();
B* b = static_cast<B*>(a);
}
void g() {
A* a = new A();
B* b = a;
}
我使用这个方法获得了一个Tile类:
public object Clone()
{
return MemberwiseClone();
}
以及继承自Checker的另一个类Tile。
我还有一个Board类,它是一个List<Tile>。我想克隆板,所以我写了这个:
public Board Clone()
{
var b = new Board(width, height);
foreach (var t in this) b.Add(t.Clone());
return