我正在尝试理解继承,我需要一些帮助来构建两个类。第一个称为A,第二个称为B。A有一个私有整数值"m_a“。它有两个构造器,默认的构造器将m_a设置为5,另一个构造器以名为m的整数作为参数,并将m_a的值设置为m。第一个将返回m_a,第二个将打印"Hello from A!“。B将有一个私有字符串m_s,一个默认构造函数,它将m_s设置为"asd“,或者设置为除空字符串以外的任何值,还有一个构造函数,它将一个字符串作为参数,并将m_s设置为它的值。就函数而言,首先,B将有一个返回m_s的函数。它将有一个与A中打印"Hello from A“函数同名的函数,该函数将
如果我有以下类:
class A
{
public:
A(int val) : m_valA(val) {}
private:
int m_valA;
};
class B : public A
{
public:
B(int val) : A(0), m_valB(val) {}
private:
int m_valB;
};
B* pb = new B;
如果我有一个带A*的函数,例如:
void func(A* pVal) {}
而pb被传递给这个函数,那么就低级内存布局而言,pval (在函数中)和pb指针有什么不同?
指针不是指向对象的开头吗?在哪
我有以下节目:
#include <iostream>
class Base {};
class Deriv : public Base
{
public:
int data;
Deriv(int data): data(data) {}
};
int main()
{
Base *t = new Deriv(2);
std::cout << t->data << std::endl;
}
当我编译它时,我得到了错误:
x.cpp: In function ‘int main()’:
x.
对于具有虚拟函数的bass类,通常称为“多态基类”。在本例中,Car类
class Car
{
virtual void drive(){std::cout << "drive right";}
};
class EuropeCar: public Car
{
void drive(){std::cout << "drive left";}
}
polymorphic base class是一般俚语,如pure abstract class,还是C++标准的一部分?
如果将双指针传递给类或函数,如何将其转换为派生类型的双指针或派生类型指针的引用,以便访问其成员?
class A
{
};
class B : public A
{
public:
void Method() {};
};
A *a_ptr = new B{};
void Function(A *const *a_ptr_ptr)
{
B *const &b_ptr_ptr = dynamic_cast<B *const>(*a_ptr_ptr);
b_ptr_ptr->Method();
};
int main()
{
Fu
例如:
class Animal
{
virtual void dummy() {}; //LINE1
}
class Cat : public Animal
{
}
Animal* a = new Cat();
if (Cat* c = dynamic_cast<Cat*> (a)) //LINE2
{
//Do something.
}
如果我从动物类中删除LINE1 (即动物类不包含虚拟成员),LINE2将无法工作。
考虑下面的代码行
#include<iostream>
using namespace std;
class base
{
int i;
public:
void printb()
{
cout << "This pointer of base "<<this<<endl;
}
};
class derived: public base
{
int i;
public:
void printd()
{
cout << "This pointer of derived "<<this&
当我对C++对象产生怀疑时,我正在阅读这些对象。假设有两个类
class X
{
virtual int def() { };
}
class Y
{
virtual int abc() { };
}
class Z : public X,public Y
{
virutal int abc() { return a };
int a;
}
现在我理解的是,Y和Z都在它们的虚拟表中引用了Z::abc(),这有助于解析要调用的正确函数。考虑一下
Y *y = new Z;
Z *z = new Z;
y->abc() // I understand
在C++中,继承公共祖先和继承接口(并要求定义派生类中的方法)是否需要多个继承?例如:我是否必须执行以下操作(而不是合并MyInterface和ParentClass):
class MyInterface;
class ParentClass;
class DerivedClass1;
class DerivedClass2;
class SomeOtherType;
class YetAnotherType;
class MyInterface {
public:
// Must be defined in all derived classes
virtual S
我正在处理我的申请问题之一。在这里,我面临的问题是,有一些函数需要使用类对象的指针来调用。
但是主要的问题是我没有类指针,而是有一个成员变量值(让我们说它是一个值列表)。在此之后,我用下面的代码做了一个小测试。
using namespace std;
class Person {
public:
Person(string name, int age) {
this->name = name;
this->age = age;
}
string getName() {
r
我经常使用多态性,但我突然明白了。我有一个例子,我的代码是:
class A{
class B : public A{
class C : public A{
我使用类A作为多态参数类型来传入B或C子类型:
//Accepts B and C objects
void aMethod(A* a){
然而,我给了A一个虚拟析构函数-这是A(以及B和C)包含vtable指针的唯一原因。
所以我的问题是,如果我没有用虚拟析构函数声明A,那么A就不是多态的--我不能在aMethod()中传递B或C类型的对象??
那么,非多态继承只是为了共享代码,而多态性(基类必须有一个vtable)允许将子类型作
我有点被这种糟糕的阶级等级问题所困扰。
class A {...}; // abstract
class B : public A {...}; // abstract
class C {...}; // abstract
class a1 : public B, public C {...}; // indirect inheritance of A
class c1 : public A, public C {...};
问题是:能否将指向C的指针(引用)转换为指向A类的指针(引用)。
我知道最好的解决方案是使C类继承自A,但它仍然会导致a1类(两个A基)的一些问题。
我有一个从非虚拟类派生的虚拟类。但是,当我将派生类强制转换为基类时,该类已损坏。我正在使用调试器查看成员变量,当我执行强制转换时,成员变量都被损坏了。当我使用调试器进行转换(可能是虚拟指针)时,我发现有一个4字节的差异。对于Ex:
class A//non-virtual class
{
~A();
int fd;
};
class B:public A
{
virtual ~B();
};
现在假设类型B的obj的地址是: 0x9354ed0。现在,当我转换它(A*)(0x9354ed0)时,调试器将字节移动4个字节。因此,强制转换的obj的起始地址是0x935ed4
将派生虚拟类强制转换
我有一个“数据库”类,它有一个存储用户的地图。还有一个"Auth“类,它继承自"Database”,并获取用户地图,以便在授权期间找到正确的用户。还有"Admin“类,它也是从”数据库“继承的,可以添加新用户。但问题是,当从“数据库”继承"Auth“和"Admin”时,会创建两个“数据库”实例。因此,如果"Admin“添加了一个新用户,"Auth”将不知道它。Чтоможносделать,чтобынесоздаватьдвекопии“数据库”?
class User;
class Database
{
private:
m
请考虑这样一个纯虚拟类:
class Foo {
public: virtual int FooBar() = 0;
};
Java开发人员会称之为“接口”。通常,您然后编程到该接口,例如(糟糕的示例,对不起):
class Bar {
public: Foo f;
};
class Child : public Foo {
public: int FooBar() { return 1; }
};
Bar b;
b.foo = Child();
这在C++中显然不起作用,因为类Foo的实例是在构造时创建的(但这是不可能的,因为Foo是一个抽象类)。
在C++中有“
我有两节课
class A {
public:
virtual void doStuff() = 0;
};
class B : public A {
int x;
public:
virtual void doStuff() override { x = x*2;} //just example function
};
和另一个类,这些类修改和使用上一个
class Foo {
A a;
public:
Foo::Foo(A &a_) : a(a_) {}
};
现在我创建了对象,并将其传递给Foo类
B b;
// edit b a
这是未定义的行为吗?
class Derived: public Base //No other bases!!!
{
//...
};
Derived d;
void *pv = &d;
Base *b = static_cast<Base*>(pv);
b->SomeMethod();
在一个合理的实现中,只要有一个继承,Base和Derived指针的比特就会匹配。但语言能保证这一点吗?
编辑:真正的目的是将指向多态C++对象的指针通过C层传递回C++回调。该对象是以派生形式创建的,但在上述回调中作为Base使用。完整的故事是。