考虑这个例子,其中基类有一些数据成员,而派生类只提供了一个额外的方法:
struct TestBase
{
int x;
TestBase() : x(5) {}
};
struct TestDerived : public TestBase
{
void myMethod()
{
x=8;
}
};
int main()
{
TestBase b;
TestDerived& d=static_cast<TestDerived&>(b);
d.myMethod();
}
Run Code Online (Sandbox Code Playgroud)
这是向下错误的类型,所以AFAIU它有未定义的行为.但是这样的情况可能会有一些例外吗,派生类的布局与基类的布局相同?
在下面的代码中,在构造obj案例1时,我们也构造了一个derived类对象,但它的成员函数是不可访问的obj.因此,在向下转换(即,在情况2中),使用obj作为源时,我们已经在其中构造derived了它.为什么obj需要多态?
如果我把我与上面的描述混淆了,为什么obj在向上转换时不需要多态,但是在向下转换时它确实需要在使用时具有多态性dynamic_cast?
class base
{
public:
base()
{
cout<< " \n base constructor \n";
}
};
class derived : public base
{
public:
derived()
{
cout << " \n derived constructor \n";
}
};
base *obj = dynamic_cast<base*> (new derived); // case 1: explicitly upcasting
derived *OBJ = dynamic_cast<derived*> (obj); // case 2: error
Run Code Online (Sandbox Code Playgroud) 我已经使自定义类继承IDataReader并已成功实现自定义ServerWriter sqlBulkCopy与使用C#对象而不是的自定义类DataTable.
事实证明,这是我所怀疑的更有效的方法.
现在我正在努力Read,我有一些问题
这是IDataReader:
// get Server Data Table Object IDataReader
public class GetSDTOIDataReaderM : IDataReader
{
//private IEnumerator<MyTestObject> enumerator = null;
public MySqlDbTableObject.Raw.SqlDbTableM propSqlTbl { get; set; }
// implementing relevant GetValue(), filedCount() and Read()
// this is how I did with WriteToServer
public bool Read()
{
return ++this.ReaderRowsCount < this.propSqlTbl.Table.ElementAt(0).Row.Count;
}
}
Run Code Online (Sandbox Code Playgroud)
该对象与其对应的SqlTable完全映射.
SqlCommand在我的自定义IDataReader上设置一个到ExecuteReader()没有工作,所以我尝试了
IDbCommand它然后它编译,但仍然在尝试阅读时我得到一个错误:
无法将"System.Data.SqlClient.SqlDataReader"类型的对象强制转换为"GetSDTOIDataReaderM"类型
this.propComunicator.AsGetSDTOCom().SqlCmd.Connection.Open();
//this is the line of the error
using (this.propComunicator.AsGetSDTOCom().SDTOIDataReader …Run Code Online (Sandbox Code Playgroud) 如何向下转换对象列表,以便将列表中的每个对象向下转换为派生类的对象?
这就是场景.
我有一个基类和一个基类的基类List,以及从它继承的两个类:
public class BaseClass
{
public List<BaseItem> items;
protected BaseClass()
{
// some code to build list of items
}
}
public class DerivedClass : BaseClass
{
public DerivedClass : base() {}
}
public class AnotherDerivedClass : BaseClass
{
public AnotherDerivedClass : base() {}
}
public class BaseItem {}
public class DerivedItem : BaseItem {}
public class AnotherDerivedItem : BaseItem {}
Run Code Online (Sandbox Code Playgroud)
我们的想法是不必复制构建项目列表所需的代码.在BaseItem拥有所有基本的东西,我需要,我可以一直低垂BaseItem到派生项目之一.
当我列出它们时会出现问题.在Listof BaseItem中声明,BaseClass因为所有派生类都必须拥有它.但是在运行时访问它时,我似乎无法向传播类转发.
是否有可能将对象向下转换为子类并不定义任何额外的变量或虚方法?
如果我有这些课程,
class A { public: A (); };
class B : public A { public: void method1 () {} B (); };
Run Code Online (Sandbox Code Playgroud)
这是(1)可能和(2)标准安全吗?
A* a = new A ();
B* b = (B*)a;
b->method1();
Run Code Online (Sandbox Code Playgroud) 为了使用tabulate很好地打印数据帧,以便将NaN和NaT打印为空单元格,我已经成功地使用了它:
print(tabulate(df.astype(object).fillna("")))
Run Code Online (Sandbox Code Playgroud)
现在,这会导致以下警告:
FutureWarning:在 .fillna、.ffill、.bfill 上向下转换对象 dtype 数组已被弃用,并将在未来版本中更改。改为调用 result.infer_objects(copy=False) 。
我不知道现在我应该做什么。我当然不知道infer_objects(copy=False)有什么帮助,因为这里的重点确实是强制将所有内容转换为字符串表示形式并用空字符串填充缺失值。
假设我有两个类:
class Employee
Run Code Online (Sandbox Code Playgroud)
和
class AdvancedEmployee:Employee
Run Code Online (Sandbox Code Playgroud)
我知道这样的事情不会起作用,因为我不能低估C#:
var employee = new Employee();
var advanced = employee as AdvancedEmployee;
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何以有效的方式完成垂头丧气?实际上我在AdvancedEmployee上有一个构造函数,它将Employee作为参数并使用它来注入它的值,基本上是克隆.
更新
为了解决可能重复的数据,我改变了方法,现在AdvancedEmployee包含了一个员工而不是一个员工.例:
class Employee;
class AdvancedEmployee
{
private employee
public AdvancedEmployee(Employee employee){
this.employee = employee
}
}
Run Code Online (Sandbox Code Playgroud) 我一直在寻找答案,但无济于事.我的问题是为什么不可能用泛型来贬低.我有一个名为Job的类,并扩展了一个名为Model的类
Job extends Model
Run Code Online (Sandbox Code Playgroud)
现在,我从一个可重用的代码中获取了一组Jobs,这些代码生成了一个Models列表
// error: Cannot cast from List<Model> to List<Job>
List<Job> jobs = (List<Job>) jobMapper.fetchAll();
Run Code Online (Sandbox Code Playgroud)
其中jobMapper.fetchAll()返回一个List,其中的每个模型都是一个Job对象.
我认为这样可行,因为我能做到:
EditText mUsername = (EditText) findViewById(R.id.editUserName);
Run Code Online (Sandbox Code Playgroud)
这是一个简单的向下转换.
在以前的版本中,为了从[String: Any]字典中获取浮点值,我可以使用let float = dict["somekey"] as? Float,但在swift4.1中,它不起作用.看来类型dict["somekey"]已经隐含推断为Double之前,我得到它,所以从铸造Double到Float总是失败.我想知道这是一个新特征还是一个bug.
- 这是更新.
我重新下载了一个Xcode9.2并做了一些实验,现在我想我弄清楚发生了什么.这是测试代码:
let dict: [String : Any] = ["key": 0.1]
if let float: Float = dict["key"] as? Float {
print(float)
} else {
print("nil")
}
let dict1: [String : Any] = ["key": NSNumber(value: 0.2)]
if let float: Float = dict1["key"] as? Float {
print(float)
} else {
print("nil")
}
let number = NSNumber(value: 0.3)
if let float: Float = number …Run Code Online (Sandbox Code Playgroud) 当java可以隐式地进行转换时,为什么不隐式地进行转换?请用一些简单的例子来解释一下?
downcast ×10
c# ×3
c++ ×3
inheritance ×2
java ×2
collections ×1
dynamic-cast ×1
generics ×1
idatareader ×1
pandas ×1
performance ×1
python ×1
sql-server ×1
swift ×1
swift4.1 ×1
upcasting ×1