我正在尝试执行以下代码
class A
{
protected int a;
protected char b;
public void Show()
{
a=5;
MessageBox.Show(""+a);
}
}
class B:A
{
public void Show()
{
b='z';
MessageBox.Show(""+a+ ""+b);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到5(中值a)作为输出,当我做aa.show()其中aa的实例A,但是当我这样做bb.show(),这里bb是实例B输出出来的,0(价值a)z(的价值b).
有人可以解释为什么派生类无法显示a的当前值,即使它已被声明为受保护,而它能够显示正确的值b?
更新:
我会尝试建议的解决方案.关于编译错误,没有,我能够得到问题中提到的输出.
我有以下代码.
class A
{
public virtual int BoardSize { get; set; }
}
class B : A
{
public override int BoardSize
{
get{return 100;}
}
}
Class Client
{
B b = new B();
b.BoardSize = 55;
}
Run Code Online (Sandbox Code Playgroud)
在基类中,属性是可读/写的.但是在派生类中它是readonly并且应该总是返回100.虽然当我运行代码时我发现它总是按预期返回100.
但是,我不希望客户端在B类中设置BoardSize.所以它不应该允许客户端写b.BoardSize = 55.
这怎么可能?
嘿所以我正在创建一个序列化函数,它接受一个基类指针'Joint',提取它'type'的联合后代,然后想要根据指针实际指向的任何类型的'关节' 来实例化正确类型的'定义'. .
然而,我仍然得到关于基类关节不包含后代类确实具有的函数的错误,即使我static_cast指向正确类型的指针.我如何使编译器意识到指针正在被铸造一个具有该功能的新类型?
我也得到关于'typedef'的错误,它可以根据关节*的'type'而不同,编译说它是未定义的.我如何告诉编译器无论如何,其中一个if语句都是真的?(Jointdef在if语句中声明)
这是来源:
template<class Archive>
b2Joint* const preSave(Archive & ar, b2Joint* Joint)
{
int Type = Joint->GetType();
ar & Type; // pulled out first so we know what kind of JointDef to instantiate
if(Type == b2JointType::e_distanceJoint){
b2DistanceJointDef JointDef;
static_cast<b2DistanceJoint *>(Joint);
JointDef.localAnchorA= Joint->GetAnchorA();
JointDef.localAnchorB= Joint->GetAnchorB();
JointDef.length= Joint->GetLength();
JointDef.frequencyHz= Joint->GetFrequency();
}
if(Type == b2JointType::e_weldJoint){
b2WeldJointDef JointDef;
static_cast<b2WeldJoint *>(Joint);
JointDef.localAnchorA= Joint->GetAnchorA();
JointDef.localAnchorB= Joint->GetAnchorB();
JointDef.referenceAngle= Joint->GetReferenceAngle(); // function added
}
if(Type == …Run Code Online (Sandbox Code Playgroud) 我知道这个问题有明确的答案:首先调用基类构造函数,然后调用派生类构造函数.
但我并不完全理解"被叫"这个词.这是否意味着构造函数的使用开始,或构造函数的使用完成?换句话说,下面的代码有两种可能的顺序:
BaseClass构造函数启动 - > BaseClass构造函数完成 - > DerivedClass构造函数启动 - > DerivedClass构造函数完成.
DerivedClass构造函数启动 - > BaseClass构造函数启动 - > BaseClass构造函数完成 - > DerivedClass构造函数完成.
哪一个应该是正确的顺序?如果1是正确的,在初始化DerivedClass实例之前,编译器如何知道调用BaseClass构造函数?
似乎案例2是正确的:"被叫"应该意味着构造函数的完成.后续问题是析构函数如何?我知道标准答案是"派生类的析构函数首先被调用".那么哪个是正确的顺序:
谢谢
class BaseClass {
public:
BaseClass() {
cout << "BaseClass constructor." << endl;
}
};
class DerivedClass : public BaseClass {
public:
DerivedClass() : BaseClass() {
cout << "DerivedClass constructor." << endl;
}
};
int main() {
DerivedClass dc;
}
Run Code Online (Sandbox Code Playgroud) 有什么办法可以让我derived class访问 的private成员,base class同时能够derived在base class内部的方法上创建对象base class?
像这样的东西:
class Derived;
class Base
{
public:
void func()
{
// I want to create the derived obj here
Derived derived;
derived.func();
}
public:
int mBase = 5;
};
class Derived : public Base
{
public:
void func()
{
// I need to have access to the private members of Base inside this method
mBase = 6;
}
};
Run Code Online (Sandbox Code Playgroud)
错误如下:
Error: derived …Run Code Online (Sandbox Code Playgroud) 所以我有一个简单的任务要做.从一个基类派生出3个类.它们非常简单,将在下面提供.我需要做的是创建一个名为的新类PolymorphicAnimal,它将能够像animal从Animal基类派生的任何其他类一样运行.确切地说,他们需要做的就是在SoundOff调用方法后显示正确的文本.我猜我需要在dynamic_cast这里使用.我的问题是,什么是使用正确的语法dynamic_cast作为一个if声明,并尽一切派生类需要有至少一个虚拟方法呢?
#include "stdafx.h"
#include <iostream>
#include <string>
class Animal {
public:
virtual std::string SoundOff() = 0;
};
class Dog : public Animal {
std::string SoundOff() override { return "Woof"; }
};
class Cat : public Animal {
std::string SoundOff() override { return "Meow"; }
};
class Cow : public Animal {
std::string SoundOff() override { return "Muu"; }
};
class PolymorphicAnimal : public Animal {
std::string …Run Code Online (Sandbox Code Playgroud) 最近,我正在学习MFC,下面的代码让我很困惑:
class CRect : public tagRECT
{
public:
// Constructors
// uninitialized rectangle
CRect();
// from left, top, right, and bottom
CRect(int l, int t, int r, int b);
// copy constructor
CRect(const RECT& srcRect);
// from a pointer to another rect
CRect(LPCRECT lpSrcRect);
// from a point and size
CRect(POINT point, SIZE size);
// from two points
CRect(POINT topLeft, POINT bottomR
...
Run Code Online (Sandbox Code Playgroud)
CRect的基类是一个结构!我以前从没学过这个.如果我打电话的话
CWnd :: GetClientRect(LPRECT lpRect);
我可以使用rect或&rect(CRect rect)作为参数.这太神奇了!
我想知道有关struct base的类的一些规则.谢谢!
我有一个特殊的要求,但无法找到解决方案.
class Base
{
public:
void func()
{
//access the member say 'var' of derived class
}
}
Run Code Online (Sandbox Code Playgroud)
base-class ×8
c++ ×6
inheritance ×3
c# ×2
class ×2
pointers ×2
constructor ×1
dynamic-cast ×1
if-statement ×1
properties ×1
static-cast ×1
struct ×1
variables ×1